c# - 从任何格式的字符串中解析小数

标签 c# parsing decimal

下一个方法的任何实现:

public static decimal StringToDecimal(string sValue)
{
    if (string.IsNullOrEmpty(sValue))
    {
        return 0;
    }
    ...
}

我的应用程序从其他机器的 excel 或 dbf 文件导入数据,我读取字符串数据没有问题,但我没有成功读取正确的数字数据,尤其是价格列。 源机器可以使用逗号作为小数点分隔符或任何格式。

decimal.Parse(...) 或 decimal.TryParse(...) 仅当数值的字符串格式与应用机器设置匹配时才有效。

最佳答案

当您调用 decimal.TryParsedecimal.Parse 时,您可以指定一种区域性(因此避免只获取系统设置)。您可以一次尝试一种您感兴趣的每种文化,直到找到可以成功解析值的文化。

bool decimal TryParseAllCultures(string text, out value)
{
    foreach (var culture in cultures)
    {
        if (decimal.TryParse(text, NumberStyles.Number, culture, out value))
        {
            return true;
        }
    }
    return false;
}

(您需要决定支持哪些文化,以及 NumberStyles.Number 是否实际上是您感兴趣的 NumberStyle。)

话虽如此,这样做非常危险。考虑“1,234”。在使用逗号作为千位分隔符的文化中,这可能意味着“一千二十四”,或者在使用逗号作为小数点分隔符的文化中,它可能意味着“不到一又四分之一”。如果您不知道应该使用哪个,则很容易出错。如果您知道值的预期范围,您可以将其用作启发式信息来检查您真正想要的值,但我仍然觉得有点担心。

关于c# - 从任何格式的字符串中解析小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900446/

相关文章:

c# - 在 C# 中返回 SortedList 中的第一个元素

javascript - 基于 Web 的应用程序 - HTML 解析

python - Python 3 中小数到 2 位的钱

r - 如何检查值是否为数字?

clojure - 如何在 Clojure 中获取字符的 ascii 十进制值?

c# - 在 MongoDB 中安全地插入或更新子文档

c# - Microsoft Graph - 获取成员(member)资格

c# - 如何判断另一个应用程序是否注册了 IPC Remoting channel ?

java - 从 HttpServlet 中的请求参数解析 JSON

parsing - 为什么这个 ANTLR4 语法有歧义?