Skip to content

Instantly share code, notes, and snippets.

@paulodiogo
Last active February 13, 2020 19:04
Show Gist options
  • Save paulodiogo/784abbd482d33a774b26af1586a91ba6 to your computer and use it in GitHub Desktop.
Save paulodiogo/784abbd482d33a774b26af1586a91ba6 to your computer and use it in GitHub Desktop.
protected void MaskedOnKeyUp(object sender, KeyEventArgs e)
{
textBox.Text = Mascara(textBox.Text, "#.##0,00");
textBox.Select(textBox.Text.Length, 0);
}
static string Mascara(string valor, string mascara)
{
var translations = new Dictionary<char, Tuple<string, bool>>
{
{ '0', new Tuple<string, bool>("\\d", false) },
{ '#', new Tuple<string, bool>("\\d", true) },
};
var buffer = new List<char>();
var value = valor == null ? "" : valor + "";
value = value.Replace(",", string.Empty).Replace(".", string.Empty);
var lengthMask = mascara.Length;
var legthValue = value.Length;
var maskIndex = lengthMask - 1;
var valueIndex = legthValue - 1;
var offset = -1;
var resetPos = -1;
var maskDigitCount = 0;
var lastMaskChar = 0;
var maskDigitPosArr = new List<int>();
Func<int, int, bool> verificarSeContinua = (mm, vv) => mm > -1 && vv > -1;
char? lastUntranslatedMaskChar = null;
while (verificarSeContinua(maskIndex, valueIndex))
{
var maskDigit = mascara[maskIndex];
var valDigit = value[valueIndex];
if (translations.TryGetValue(maskDigit, out Tuple<string, bool> translation))
{
if (Regex.IsMatch(valDigit.ToString(), translation.Item1))
{
buffer.Insert(0, valDigit);
if (translation.Item2)
{
if (resetPos == -1)
{
resetPos = maskIndex;
}
else if (maskIndex == lastMaskChar && maskIndex != resetPos)
{
maskIndex = resetPos - offset;
}
if (lastMaskChar == resetPos)
{
maskIndex -= offset;
}
}
maskIndex += offset;
}
else if (valDigit == lastUntranslatedMaskChar)
{
maskDigitCount--;
lastUntranslatedMaskChar = null;
}
else { }
valueIndex += offset;
}
else
{
buffer.Insert(0, maskDigit);
if (valDigit == maskDigit)
{
maskDigitPosArr.Add(valueIndex);
valueIndex += offset;
}
else
{
lastUntranslatedMaskChar = maskDigit;
maskDigitPosArr.Add(valueIndex + maskDigitCount);
maskDigitCount++;
}
maskIndex += offset;
}
}
return string.Join("", buffer);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment