将字符串转换为带格式的十进制数

14

我需要将一个字符串转换成十进制数(decimal)在C#中,但这个字符串有不同的格式。

例如:

"50085"

"500,85"

"500.85"

应该将其转换为十进制数500.85。是否有一种简化的方法可以使用格式进行此转换?


十进制数不以“500,85”的格式存储。您是在请求一对十进制数吗? - myermian
2
@myermian:这取决于您的文化/区域设置,可能会有所不同。并非每个人都以相同的方式表示小数值。在这个例子中,500,85 可能等同于 500.85 - Cody Gray
1
你的字符串中可能包含 50,865.85 吗? - V4Vendetta
7个回答

24

一些文化习惯使用逗号来表示浮点数。您可以在aspx页面上使用以下代码进行测试:

var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);

当线程文化设置为使用逗号作为浮点数时,此代码将返回501。您可以通过以下方式强制完成:

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });

18

虽然decimal.Parse()是你要找的方法,但你需要向它提供更多信息。它不会自动在你提供的三种格式中选择,你需要告诉它你期望的格式(以IFormatProvider的形式)。即使使用IFormatProvider,我认为“50085”也不会被正确地解析。

我看到唯一一致的事情是,从你的示例中似乎总是期望精确到两位小数。如果是这样的话,你可以删除所有的句号和逗号,然后除以100。

或许可以尝试这样做:

public decimal? CustomParse(string incomingValue)
{
    decimal val;
    if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
        return null;
    return val / 100;
}

我找不到任何格式来解决我的问题。我使用这个实现并添加小数位。 谢谢。 - Daniel Gielow Junior

6
这将会起作用,取决于您的文化设置:
string s = "500.85";
decimal d = decimal.Parse(s);

如果您的文化背景默认不允许使用英文逗号代替小数点,您可能需要进行以下操作:
s = s.Replace(',','.');

但需要检查多个....这似乎更多地涉及输入净化的问题。如果您能够验证和净化输入以符合一组规则,则转换为十进制将变得更加容易。


如果提到了输入验证,就加1分... 如果没有处理“50085”,就扣1分。这样就平衡了,不算投票 :) - Chris Shaffer
1
我担心可能会有像 50.865,85 这样的输入。 - V4Vendetta
@Chris,50085在decimal.Parse后会得到50085。不过如果你认为这并没有完全回答OP的问题,我也接受否决。 :) - Jaymz

5

尝试下面的代码:

string numValue = "500,85";
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR");
decimal decValue;
bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue);
if (decValid)
{
    lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat);
}

由于我输入了一个值为500.85,我将假设文化是法国,因此小数分隔符是 ","。然后使用 decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat,out decValue); 将返回 decValue 值为 500.85。同样,如果用户是美国英语,则更改 culInfo 构造函数。


2

有很多方法:

  1. System.Convert.ToDecimal("232.23")
  2. Double.Parse("232.23")
  3. double test; Double.TryParse("232.23", out test)

确保你使用 try 和 catch...


2

这是一个名为数字分组符号的新功能。

操作步骤:

  1. 打开控制面板中的区域和语言
  2. 点击附加设置
  3. 在数字选项卡上
  4. 数字分组符号设置为自定义设置。 更改逗号; 替换为(任何字符A到Z或{/,}). 数字分组符号=e;

例子:

string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;

1
尝试这个。
 public decimal AutoParse(string value)
    {
        if (Convert.ToDecimal("3.3") == ((decimal)3.3))
        {
            return Convert.ToDecimal(value.Replace(",", "."));
        }
        else
        {
            return Convert.ToDecimal(value.Replace(".", ","));
        }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接