2011-05-02 41 views
4

如何将字符串解析为十进制,以便适用于两种格式 - w /逗号和句点?将字符串解析为十进制,逗号和句点

[Fact] 
public void foo(){ 
    var a="1,1"; 
    var b="1.1"; 
    Assert.Equal(Parse(a),Parse(b)); 
} 
private decimal Parse(string s){ 
    return decimal.Parse(s,NumberStyles.Any, 
    CultureInfo.InvariantCulture); 
} 

输出:

Test 'Unit.Sandbox.foo' failed: Assert.Equal() Failure 
Expected: 11 
Actual: 1,1 
+1

即使解析,为什么它们会相等?一个是1点1,另一个是11 ...? (因为你明确说明不变的文化) – 2011-05-02 10:00:52

+0

@Marc Gravell我不知道我是否正确理解你。无论如何 - 目标是编写解析函数,以便理解这两种格式。断言反映了我试图达到的目标。 – 2011-05-02 10:02:33

+0

@Arnis:我认为马克提到了支持小数点和千位分隔符使用不同文化的模糊性。但我相信你只关心解析小数点? – Groo 2011-05-02 10:05:28

回答

0

您应该通过一个逗号十进制字符串解析之前修改货币小数点分隔符为逗号得到期望的结果。这里有一些食物资源:

http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencydecimalseparator.aspx#Y888

你可以替换地实现自己的IFormatProvider这里讨论:

http://msdn.microsoft.com/en-us/library/t7xswkc6.aspx http://msdn.microsoft.com/en-us/library/system .globalization.numberformatinfo.aspx

哦,或者你可以做一个肮脏的黑客攻击,并简单地用“。”替换“,”。 ;)

+0

更改小数分隔符为我工作。 – Matze 2013-07-04 16:19:55

6

你可以试试:

private decimal Parse(string s){ 
    s = s.Replace(",", CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator); 
    return decimal.Parse(s,NumberStyles.Any, 
    CultureInfo.InvariantCulture); 
} 
+0

如果OP想要支持数千个分隔符字符,那么这将不起作用。 – Groo 2011-05-02 10:14:06

+2

@Groo的确,但我不明白他如何支持千位分隔符,如果逗号和点应该以同样的方式处理... – 2011-05-02 10:15:45

+0

@Thomas这是不可能的...... :( – 2011-05-02 10:25:37

4

这个怎么样?

private static decimal Parse(string s) 
    { 
     s = s.Replace(",", "."); 
     return decimal.Parse(s); 
    } 
+6

自己尝试:1.000.000,25和1000000.25 – 2011-09-22 07:45:47

相关问题