Last active
February 13, 2020 19:04
-
-
Save paulodiogo/784abbd482d33a774b26af1586a91ba6 to your computer and use it in GitHub Desktop.
Windows Forms Currency and Thousand Format (NAIVE) Based on => https://github.com/igorescobar/jQuery-Mask-Plugin/blob/d4b031bdcfe367d4372fc13de0dff024e2bef768/src/jquery.mask.js#L271
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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