C#中的自定义千位分隔符

时间:2019-02-21 19:15:24

标签: c#

我想请您帮忙解决我的问题。我想在文本框中添加一些自定义货币分隔符。请使用数千个空格,并保留逗号/点作为小数而不舍入。此机制将在文本框文本更改回调中使用。但是我没有找到正确的答案。 当然,一个非常丑陋的解决方案可能是找到索引“”。并在之前/之后存储值,并在其中放置空间。但是,如果可能的话,我正在寻找一些使用区域性设置的解决方案。

输入和预期输出:

   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;
}

如果有人有更好的解决方案,请毫不犹豫地发布它;)。

0 个答案:

没有答案