将字符串转换为小数分隔符的最佳方法"." 和",",麻木不仁的方式?

And*_*rko 19 .net c# type-conversion

应用程序处理表示来自不同文化的小数的字符串.例如,"1.1和"1,1"是相同的值.

我玩过Decimal.TryParse旗帜组合,但无法达到我想要的效果.毕竟"1,1"变为"11"或"0".

是否可以在一行代码中将这些字符串转换为十进制而无需将","char替换为".".还是在玩NumberFormat.NumberDecimalSeparator

你如何处理这种情况?

先感谢您!

Jef*_*ado 33

您可以创建CultureInfo在解析时使用的临时对象.

// get a temporary culture (clone) to modify
var ci = CultureInfo.InvariantCulture.Clone() as CultureInfo;
ci.NumberFormat.NumberDecimalSeparator = ",";
decimal number = decimal.Parse("1,1", ci); // 1.1
Run Code Online (Sandbox Code Playgroud)

  • 覆盖 NumberDecimalSeparator 的 InvariantCulture 怎么样? (2认同)

Dev*_*per 11

我发现了另一种方法.它看起来很奇怪但它对我来说很好.

因此,如果您不了解目标系统的文化,并且您不知道您将获得12.33或12,33的哪个值,您可以执行以下操作

string amount = "12.33";
// or i.e. string amount = "12,33";

var c = System.Threading.Thread.CurrentThread.CurrentCulture;
var s = c.NumberFormat.CurrencyDecimalSeparator;

amount = amount.Replace(",", s);
amount = amount.Replace(".", s);

decimal transactionAmount = Convert.ToDecimal(amount); 
Run Code Online (Sandbox Code Playgroud)

  • 字符串很危险,千位分隔符可能有问题吗?1.2345,40? (3认同)

Noo*_*ilk 6

你只需要在调用时设置正确的文化Parse,就像这样:

string s = "11,20";

decimal c1 = decimal.Parse(s, new CultureInfo("fr-FR"));
decimal c2 = decimal.Parse(s, new CultureInfo("en-AU"));

Console.WriteLine(c1);
Console.WriteLine(c2);
Run Code Online (Sandbox Code Playgroud)

  • 您必须确保您了解原始文化,否则您无法决定该数字的含义。 (2认同)

Oli*_*ops 6

您有以下可能性:

  1. 你了解文化
    1. 使用当前的"文化"设置,为其安装计算机
    2. 您让用户决定在您的程序中设置他的文化 - >用户设置
  2. 你不懂文化
    1. 您必须做出决定:您必须定义并记录您的决定
    2. 猜猜:你试图解析,并尝试解析,并尝试...直到你得到有效的数字