我想将像 "3.5"
这样的字符串解析为double . 然而,
double.Parse("3.5")
收益35和
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
扔了 FormatException
.
现在我的计算机的语言环境设置为德语,其中逗号用作小数分隔符 . 它可能需要对此做一些事情并期待 "3,5"
作为输入,但我不确定 .
如何解析包含十进制数的字符串,该十进制数可能是也可能不是我当前语言环境中指定的格式?
17 回答
我不想在所有解析中指定语言环境,而是更喜欢设置应用程序范围的语言环境,但如果字符串格式在应用程序中不一致,则可能无效 .
在应用程序开始时定义它将使所有双解析期望逗号作为小数分隔符 . 您可以设置适当的区域设置,以便小数和千位分隔符适合您要解析的字符串 .
我通常使用多文化函数来解析用户输入,主要是因为如果有人习惯于小键盘并使用使用逗号作为小数分隔符的文化,那么该人将使用小键盘的点而不是逗号 .
请注意,@ nicie评论是真的 . 为了我的辩护,我在受控环境中使用此功能,我知道文化可以是en-US,en-CA或fr-CA . 我使用这个函数是因为在法语中,我们使用逗号作为小数分隔符,但是任何曾在金融界工作过的人都会在小键盘上使用小数分隔符,但这是一个点,而不是逗号 . 因此,即使在fr-CA文化中,我也需要解析具有小数分隔符的数字 .
我不能写评论,所以我写在这里:
double.Parse("3.5", CultureInfo.InvariantCulture) 不是一个好主意,因为在加拿大我们写的是3,5而不是3.5,这个函数给我们35个作为结果 .
我在电脑上测试了两个:
这是 Pierre-Alain Vigeant 提到的正确方法
诀窍是使用不变的文化,在所有文化中解析点 .
在解析之前用逗号替换逗号 . 在逗号为小数分隔符的国家/地区中很有用 . 考虑将用户输入(如有必要)限制为一个逗号或点 .
看,上面的每个答案建议用常量字符串写一个字符串替换只能是错误的 . 为什么?因为您不尊重Windows的区域设置! Windows确保用户可以自由设置他/她想要的任何分隔符 . 他/她可以打开控制面板,进入区域面板,点击高级并随时更改角色 . 即使在你的程序运行期间 . 想一想 . 一个好的解决方案必须要注意这一点 .
所以,首先你必须问自己,这个数字来自哪里,你要解析 . 如果它来自.NET Framework中的输入没问题,因为它将采用相同的格式 . 但也许它来自外部,可能来自外部服务器,也许来自只支持字符串属性的旧数据库 . 在那里,数据库管理员应该给出一个规则,以这种格式存储数字 . 如果你知道它将是一个美国格式的美国数据库,你可以使用这段代码:
这将在世界任何地方都能正常工作 . 请不要使用'Convert.ToXxxx' . “转换”类仅被视为任何方向转换的基础 . 此外:您也可以使用DateTimes的类似机制 .
以下代码可以在任何方案中完成工作 . 它有点解析 .
我认为如果值来自用户输入,则无法100%正确转换 . 例如如果值为123.456,则可以是分组,也可以是小数点 . 如果你真的需要100%,你必须描述你的格式并在不正确的情况下抛出异常 .
但是我改进了JanW的代码,所以我们更加领先于100% . 背后的想法是,如果最后一个分隔符是groupSeperator,这将是一个整数类型,而不是double .
添加的代码位于GetDouble的第一个if中 .
没有指定要查找的小数点分隔符很困难,但是如果你这样做,这就是我正在使用的:
这适用于任何文化 . 它正确地无法解析具有多个小数分隔符的字符串,这与替换而不是交换的实现不同 .
我改进了@JanW的代码也是......
我需要它来格式化医疗器械的结果,他们还发送“> 1000”,“23.3e02”,“350E-02”和“负面” .
我认为这是最好的答案:
以下效率较低,但我使用这种逻辑 . 仅当小数点后有两位数时才有效 .
将数字乘以然后除以之前相乘的数字 .
例如,