检测 VB.Net 中数字的文化,即小数点/千位分隔符的句点或逗号

     2023-03-31     145

关键词:

【中文标题】检测 VB.Net 中数字的文化,即小数点/千位分隔符的句点或逗号【英文标题】:Detect culture of number in VB.Net i.e. period or comma for decimal point / thousands separator 【发布时间】:2011-09-26 21:13:26 【问题描述】:

在 VB.Net 中,有没有一种方法可以自动检测数字字符串表示的文化?我来解释一下情况:

我们的 asp.net 网站接收船数据的 xml 数据馈送。大多数时候,价格的数字格式使用简单的非格式化整数,例如“999000”。这对我们来说很容易处理。

有时,千位分隔符使用逗号,小数点使用句点。此外,这很好,因为我们的数据导入理解这一点。示例“999,000.00”。

我们开始从法国获取一些数据,其中一些价格已经输入了句点和千位分隔符,因为许多欧洲国家都是这样做的。例如。 “999.000,00”。在这里,我们的系统会将其解释为 999 磅,而不是预期的 999000 磅。

很遗憾,数据馈送包含多种格式的价格,每种格式都没有任何文化指标。有谁知道任何内置的 .net 函数可以根据句点和逗号的位置自动检测字符串数字的文化?

【问题讨论】:

想想你在问什么,你会意识到答案是“不,当然不是”。相反,也许您应该将您的提要定义为仅接受整数。事实上,价格的货币单位是什么?欧元?也许其中一些数字是法郎? 我同意最好的方法是更清楚地定义提要格式。我们正在开发一个新版本——但在完成之前,我们一直在努力充分利用这一版本。货币单位在 Feed 的单独字段中定义。 那么也许货币可以告知您对价格格式的看法? 对此有任何公认的答案吗?如果你能接受其中一个和/或评论它会很好,所以我们都可以跟随你的脚步。 TIMINeutron,是的,我很抱歉直到现在才回到这里。谢谢大家的回复。我认为最终 John Saunders 给出了答案——我们只需要继续修复提要格式并做好记录,以便清楚应该使用哪种格式。 【参考方案1】:

我在 vbforums 上找到了a thread,建议如何按文化获取小数点分隔符。

我制作了一个转换器,可以使用 oledb、excel 对象、mysql 等在不同文件之间进行转换。当我转换为 Excel 和 Access 文件时,使用“decimalSeparator”是让数字格式正常工作的解决方案。

Dim decimalSeparator As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

cellValue = cellValue.Replace(".", decimalSeparator ).Replace(",", decimalSeparator )

【讨论】:

这确实是解决这个问题的方法。简单、准确且不基于用户输入。【参考方案2】:

据我所知,没有内置方法可以从数字字符串中确定 CultureInfo。而且我严重怀疑它永远不会发生,因为没有 100% 安全的方法来做到这一点。

在您找到更好的解决方案之前(例如:在发送方进行一些更改),我想您能做的最好的事情就是分两步减少出错的机会:

1)输入数据的清理和标准化

Dim input as String = " 99 9.000,00 "
' This way you can remove unwanted characters (anything that is not a digit, and the following symbols: ".", "-", ",")
Dim fixedInput as String = Regex.Replace(input, "[^\d-,\.]", "")
' fixedInput now is "999.000,00"

2) 自己猜格式

Dim indexOfDot as Integer = fixedInput.IndexOf(".")
Dim indexOfComma as Integer = fixedInput.IndexOf(",")
Dim cultureTestOrder as List(Of CultureInfo) = new List(Of CultureInfo)
Dim parsingResult as Double?
Try
    If indexOfDot > 0 And indexOfComma > 0 Then
        ' There are both the dot and the comma..let's check their order
        If indexOfDot > indexOfComma Then
            ' The dot comes after the comma. It should be en-US like Culture
            parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
        Else
            ' The dot comes after the comma. It should be it-IT like Culture
            parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
        End If
    Else If indexOfDot = fixedInput.Length-3 Then
        ' There is only the dot! And it is followed by exactly two digits..it should be en-US like Culture
        parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
    Else If indexOfComma = fixedInput.Length-3 Then
        ' There is only the comma! And it is followed by exactly two digits..it should be en-US like Culture
        parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
    End If
Catch
End Try
If Not parsingResult.HasValue Then
    Try
        ' There is no dot or comma, or the parsing failed for some reason. Let's try a less specific parsing.
        parsingResult = Double.Parse(fixedInput, NumberStyles.Any, NumberFormatInfo.InvariantInfo)
    Catch
    End Try 
End If
If Not parsingResult.HasValue Then
    ' Conversion not possible, throw exception or do something else
Else
    ' Use parsingResult.Value
End If

这种方式不是 100% 安全的,但它应该仍然比您当前的代码更好(并且至少在您提供的示例数据上按预期工作)。

【讨论】:

谢谢 Fulvio - 我会试试这个和 debasnett 的方法。【参考方案3】:

不知道字符串可以格式化多少种不同方式的细节...这适用于您提供的三个示例

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim v As String = "999.123,45"
    Debug.WriteLine(foo(v))

    v = "999,123.45"
    Debug.WriteLine(foo(v))

    v = "999123"
    Debug.WriteLine(foo(v))
End Sub

Private Function foo(value As String) As Double
    Dim style As NumberStyles = NumberStyles.AllowThousands Or NumberStyles.AllowDecimalPoint
    Dim culture As CultureInfo = CultureInfo.InvariantCulture
    Dim rv As Double
    If Double.TryParse(value, style, culture, rv) Then
        Debug.WriteLine(",.Converted '0' to 1.", value, rv)
    Else
        Dim styleES As NumberStyles = NumberStyles.AllowThousands Or NumberStyles.AllowDecimalPoint
        Dim cultureES As CultureInfo = CultureInfo.CreateSpecificCulture("es-ES")

        If Double.TryParse(value, styleES, cultureES, rv) Then
            Debug.WriteLine(".,Converted '0' to 1.", value, rv)
        Else
            Throw New ArgumentException
        End If
    End If
    Return rv
End Function

【讨论】:

谢谢 - 我会试试看。【参考方案4】:

'这个变量在 OS 的情况下为 True。区域设置使用点作为小数分隔符,其他情况下为 false。

Dim bAmerican as boolean=Cdec("0,2") > 1

原帖: https://www.linkedin.com/groups/8141257/8141257-6347113651027079171

【讨论】:

VB.NET 根据所选文化格式化数字

】VB.NET根据所选文化格式化数字【英文标题】:VB.NETFormattingnumbersaccordingcultureselected【发布时间】:2016-02-2823:59:25【问题描述】:我有一个多语言的vb.net应用程序。我正在尝试格式化一个数字(ULong)以根据当前语言货币组分隔... 查看详情

在 Swift 中将小数点后的逗号和零值添加到千位后的数字字符串中

】在Swift中将小数点后的逗号和零值添加到千位后的数字字符串中【英文标题】:AddcommaandzerovalueafterdecimaltoastringofNumberafterthousandinSwift【发布时间】:2019-11-1410:48:16【问题描述】:您好,我从后端API获取字符串类型的价格,我试... 查看详情

在python中使用本地化的千位分隔符和小数精度格式化数字

】在python中使用本地化的千位分隔符和小数精度格式化数字【英文标题】:Formattingnumberswithlocalizedthousandsseparatorsanddecimalprecisioninpython【发布时间】:2017-11-1006:26:18【问题描述】:可以用:格式化具有小数精度的数字print(":.2f".format... 查看详情

千位分组来格式化数字函数

...nt,separator)函数通过千位分组来格式化数字。decimals:取得小数点位数decimalpoint:设置小数点符号separator:设置千分位的分隔符*如果遇到已经有小数点的数字,而取得的小数的位数少于原始传入的小数位数,进行四舍五入输出;例... 查看详情

根据文化代码在Python中格式化数字

...的函数可以满足我的需要:如果文化代码为“en-US”,则小数点为“,”,小数点为“.”(例如:1,000.00),如 查看详情

带有千位分隔符和小数的数字格式(如有必要)

...努力寻找解决方案(通过反复试验以及搜索)如果有一个小数点,但如果没有小数点数字是整数。这是我想要实现的目标:-“123”显示为“123”- 查看详情

VB.net / SQL 可以存储数字、逗号、小数(2位)和vbcrlf的数据类型?

】VB.net/SQL可以存储数字、逗号、小数(2位)和vbcrlf的数据类型?【英文标题】:VB.net/SQLDatatypethatcanstorenumbers,comma,decimal(2places)andvbcrlf?【发布时间】:2015-01-1606:00:33【问题描述】:我总是得到一个“字符串或二进制数据将被截断... 查看详情

用小数到百位数的千位分组验证数字

】用小数到百位数的千位分组验证数字【英文标题】:Validateanumberwithgroupedthousandswithdecimaltothehundreth【发布时间】:2010-10-2515:05:06【问题描述】:寻找一种简单的方法(函数/正则表达式)来验证包含数千个分组的数字。示例编号... 查看详情

VB.NET本地化,检测未翻译文本

】VB.NET本地化,检测未翻译文本【英文标题】:VB.NETlocalization,detectuntranslatedtext【发布时间】:2011-01-0611:35:08【问题描述】:我正在做一个项目,其中本地化主要是使用资源文件/文化来完成的。如果该语言不存在翻译,则使用默... 查看详情

货币上的符号是啥?

...欧元之前的葡萄牙士姑度和法国法郎的符号-货币符号之小数点的用法由于国际上语言里最常见的数字读法是千位分位,为了方便阅读引入了小数点来分组数字。但是各地习俗不同,导致小数点的含义也不同。如果当地习俗是用... 查看详情

使用VBA为负数设置带有千位分隔符、2位小数和减号的标准数字格式?

...用VBA为负数设置带有千位分隔符、2位小数和减号的标准数字格式?【英文标题】:Setstandardnumberformatwiththousandseparator,2decimalsandminussignfornegativenumbersusingVBA?【发布时间】:2015-01-2111:35:40【问题描述】:我在***上看到过之前提出的... 查看详情

如何设置带两位小数的千位分隔符?

...【问题描述】:在我的应用程序中,我限制用户输入7.2位数字(如1234567.12)。输入时应显示为1,234,567.12。但它必须在数据库中保存为1234567.12。我使用十进制格式为“###,###.##"显示在编辑文本框中。但是使用浮点 查看详情

15、pandas的设置数字格式,小数位数、百分号、千位分隔符

参考技术A在我们制作各种报表快要结束的时候都需要对数字格式进行设置,增加报表的可读性,主要有小数位数、百分号和千位分隔符等。1、设置小数位数,四舍五入round()函数是做四舍五入,而decimals参数是设置保留小数的位... 查看详情

vb.net怎么设置数字保留小数点位数

vb.net怎么设置数字保留小数点位数参考技术A举个例子DimaAsDecimal=1.999DimbAsDecimal=Math.Round(a,2)结果为b=2.00四舍五入保留两位本回答被提问者采纳 参考技术BDimdAsDouble=3.141592654DimsAsString=d.ToString("F3")保留3位精度追答注意,会四... 查看详情

如何在 C# 中使用文化信息设置百万分隔符 (') 和千位 (.)

】如何在C#中使用文化信息设置百万分隔符(\\\')和千位(.)【英文标题】:HowtosetMillionseparator(\')andthousand(.)usingcultureinfoinC#如何在C#中使用文化信息设置百万分隔符(\')和千位(.)【发布时间】:2017-06-2215:10:44【问题描述】:我正在尝... 查看详情

如何在vuetify表单数字输入中检测小数点前后的特定长度数

】如何在vuetify表单数字输入中检测小数点前后的特定长度数【英文标题】:Howtodetectspecificnumberoflengthbeforeandafterdecimalpointinvuetifyformnumberinput【发布时间】:2021-12-1214:53:07【问题描述】:在输入时,我只想接受十进制和浮点数。小... 查看详情

谷歌可视化错误的数字格式

...googleapi文档中说,默认情况下,千位分隔符是“,”,而小数点分隔符是“。”,但我必须反转才能得到想要的结果。我的意思是,默认情况下,当我创建图表时,如果我想要点,我会得到像3,50和3.50这样的数字,我 查看详情

asp.net mvc 设置数字格式默认十进制千位分隔符

】asp.netmvc设置数字格式默认十进制千位分隔符【英文标题】:asp.netmvcsetnumberformatdefaultdecimalthousandsseparators【发布时间】:2012-10-2611:56:25【问题描述】:如何在asp.netmvc中设置默认的十进制和千位分隔符来格式化数字而不考虑文化... 查看详情