我想请您帮忙解决我的问题。我想在文本框中添加一些自定义货币分隔符。请使用数千个空格,并保留逗号/点作为小数而不舍入。此机制将在文本框文本更改回调中使用。但是我没有找到正确的答案。 当然,一个非常丑陋的解决方案可能是找到索引“”。并在之前/之后存储值,并在其中放置空间。但是,如果可能的话,我正在寻找一些使用区域性设置的解决方案。
输入和预期输出:
123 -> 123
1234 -> 1 234
12345 -> 12 345
123456 -> 123 456
123.1 -> 123.1
123.11 -> 123.11
1234.1 -> 1 234.1
1234.11 -> 1 234.11
1234.111 -> 1 234.111
...
我试图使其正常运行,但没有成功。
// still some decimal places have been left
NumberFormatInfo nfi = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
nfi.NumberGroupSeparator = " ";
double test = 1234.567;
Console.WriteLine(string.Format("{0:#,##}", test)); // 1 2345
Console.WriteLine(test.ToString("N", nfi)); // 12 345.00
Console.WriteLine(test.ToString("#,0.00", nfi)); // 12 345.00
Console.WriteLine(string.Format("{0}", test)); // 1234.567
另一个测试看起来不错,但由于小数点/逗号问题,它在解析时崩溃了。
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US");
culture.NumberFormat.NumberGroupSeparator = " ";
int valueBefore = Int32.Parse(textBox1.Text, System.Globalization.NumberStyles.AllowThousands);
textBox1.Text = String.Format(culture, "{0:N0}", valueBefore);
textBox1.Select(textBox1.Text.Length, 0);
非常感谢您的帮助。
编辑:
经过一些测试,看起来像是我要找的东西。
string value = tb1.Text;
float fl;
CultureInfo culture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
culture.NumberFormat.NumberGroupSeparator = " ";
if (float.TryParse (tb1.Text, NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, culture, out fl))
{
string rest = string.Empty;
string[] splits = value.ToString(culture).Split(new[] { culture.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries);
if (splits.Count() > 1) rest = splits[1];
if (value.Contains (culture.NumberFormat.NumberDecimalSeparator))
rest = culture.NumberFormat.NumberDecimalSeparator + rest;
value = fl.ToString ("N0", culture);
tb1.Text = value + rest;
}
如果有人有更好的解决方案,请毫不犹豫地发布它;)。