VB.Net中如何将带格式的字符串转换回Double类型?
问题描述
我用自定义数值格式把Double类型值格式化为带单位的字符串,示例代码如下:
Dim strFormat = "#,##0.00 weeks" Dim strDisplayText As String = dblIn.ToString(strFormat) ' dblIn 是 Double 类型
该字符串在WPF DataGrid的文本框中显示,用户可能会编辑它,之后需要将文本转换回Double类型:
Dim dblOut = ???(strDisplayText, strFormat) ' 如果strDisplayText未被修改,dblOut应与dblIn一致 If dblOut.ToString(strFormat) <> strDisplayText Then Print("转换失败。") End If
遇到的问题:
Double.Parse(及TryParse)会因为字符串末尾的单位(比如"weeks")解析失败Val函数无法处理作为分组分隔符的逗号(",")strFormat是从文件读取的,可能是任意有效的标准或自定义数值格式
解决方案
要实现可靠的转换,需要剥离字符串中的非数值固定文本,同时正确解析带千分位的数值,具体步骤如下:
1. 提取输入字符串中的数值部分
通过正则表达式匹配输入字符串里的数值片段,支持正负号、千分位分隔符和小数点:
Dim numMatch As Match = Regex.Match(input, "-?\d{1,3}(,\d{3})*(\.\d+)?")
这个正则能匹配类似1,234.56、-789、0.12这类符合格式的数值。
2. 用指定格式解析数值
使用Double.TryParse并指定NumberStyles,确保能识别千分位和小数点:
Dim style As NumberStyles = NumberStyles.AllowThousands Or NumberStyles.AllowDecimalPoint Or NumberStyles.AllowLeadingSign If Double.TryParse(numStr, style, CultureInfo.CurrentCulture, result) Then ' 解析成功 End If
完整示例函数
Imports System.Text.RegularExpressions Imports System.Globalization Function ParseFormattedDouble(input As String, format As String) As Double ' 提取数值部分 Dim numMatch As Match = Regex.Match(input, "-?\d{1,3}(,\d{3})*(\.\d+)?") If Not numMatch.Success Then Throw New FormatException("无法从输入字符串中提取有效数值") End If Dim numStr As String = numMatch.Value ' 解析数值 Dim result As Double Dim style As NumberStyles = NumberStyles.AllowThousands Or NumberStyles.AllowDecimalPoint Or NumberStyles.AllowLeadingSign If Not Double.TryParse(numStr, style, CultureInfo.CurrentCulture, result) Then Throw New FormatException("数值解析失败") End If Return result End Function
验证转换一致性
转换完成后,用原格式重新格式化数值,和输入字符串对比(建议先去除首尾空格,避免用户输入的空格干扰):
Dim dblOut As Double = ParseFormattedDouble(strDisplayText, strFormat) If dblOut.ToString(strFormat).Trim() <> strDisplayText.Trim() Then Print("转换失败。") End If
补充说明
- 如果格式包含前缀(比如"$#,##0.00"),上述正则依然能正确提取数值部分
- 若格式中的固定文本包含数字或特殊符号,需要调整正则表达式以适配,但绝大多数自定义格式的固定文本为纯文本,该方法能覆盖大部分场景
- 对于标准数值格式(如"N2"、"C"),该方法同样适用,因为格式化后的字符串结构符合正则匹配规则
内容的提问来源于stack exchange,提问作者awi2b
相关产品推荐
相关产品推荐

