Vb.net 建立一个字符串作为格式,然后使用它作为格式

Vb.net 建立一个字符串作为格式,然后使用它作为格式,vb.net,string,format,Vb.net,String,Format,有没有办法将字符串用作IFormatProvider 大致如下: Dim MyValue As String = "1216,00" Dim MyDecimalSymbol As String = "." Dim Format As String = "00" & MyDecimalSymbol & Decimals MyValue = MyValue.ToString(Format) 'Output should be 1216.00 遗憾的是,函数不接受字符串,我必须动态构

有没有办法将字符串用作IFormatProvider

大致如下:

Dim MyValue As String = "1216,00"
Dim MyDecimalSymbol As String = "."
Dim Format As String = "00" & MyDecimalSymbol & Decimals
MyValue = MyValue.ToString(Format)
'Output should be 1216.00
遗憾的是,函数不接受字符串,我必须动态构建它,有什么方法可以做到这一点吗?

您喜欢这样做:

    Dim MyValue As Double = 1216.01
    Dim MyDecimalSymbol As String = "."
    Dim Decimals As String = "00"
    Dim Format As String = "00" & MyDecimalSymbol & Decimals
    Dim myStringValue As String
    myStringValue = MyValue.ToString(Format)
    Console.WriteLine(myStringValue)
    Console.ReadLine()
但它不会像您预期的那样工作


小数点“.”将替换为您的货币设置(因此它在美国和其他国家/地区适用,但在某些欧洲国家/地区不适用)。

类似的内容将用当前区域性小数分隔符替换逗号,并根据需要格式化值,但是没有检查以确保值中首先有逗号,因此您可能需要添加:

    Dim MyValue As String = "1216,00"
    Dim MyDecimalSymbol As String = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
    Dim decimals = "00"
    MyValue = String.Format("{0:00}{1}{2}", MyValue.Split(","c)(0), MyDecimalSymbol, CInt(MyValue.Split(","c)(1)).ToString(decimals))

好的,谢谢大家的建议,我用了一种不同的方式来实现我想要的,那就是:

If Value.IndexOf(MyNumberGroupSymbol) <> -1 And Value.IndexOf(MyDecimalSymbol) = -1 Then
                If Value.Length - (Value.IndexOf(MyNumberGroupSymbol) + 1) = 1 Or Value.Length - (Value.IndexOf(MyNumberGroupSymbol) + 1) = 2 Then
                    'The group separator has been used instead of the decimal separator so the correct decimal separator will be set
                    Value = Value.Replace(MyNumberGroupSymbol, MyDecimalSymbol)
                End If
            End If
            If Double.TryParse(Value, System.Globalization.NumberStyles.Number, Threading.Thread.CurrentThread.CurrentUICulture, 0) = True 
                If MyDecimalSymbol = "." Then
                    Dim MyDouble As Double = Double.Parse(Value, New System.Globalization.CultureInfo("en-GB"))
                    MyValue = MyDouble.ToString("N" & Decimals, New System.Globalization.CultureInfo("en-GB"))
                    'Decimals makes sure there are enough decimals after the decimal separator
                Else
                    Dim MyDouble As Double = Double.Parse(Value, New System.Globalization.CultureInfo("nl-NL"))
                    MyValue = MyDouble.ToString("N" & Decimals, New System.Globalization.CultureInfo("nl-NL"))
                End If
            End If
如果Value.IndexOf(MyNumberGroupSymbol)-1和Value.IndexOf(MyDecimalSymbol)=-1,则
如果Value.Length-(Value.IndexOf(MyNumberGroupSymbol)+1)=1或Value.Length-(Value.IndexOf(MyNumberGroupSymbol)+1)=2,则
'已使用组分隔符而不是小数分隔符,因此将设置正确的小数分隔符
Value=Value.Replace(MyNumberGroupSymbol,MyDecimalSymbol)
如果结束
如果结束
如果Double.TryParse(值,System.Globalization.NumberStyles.Number,Threading.Thread.CurrentThread.CurrentUICulture,0)=True
如果MyDecimalSymbol=“”,则
Dim MyDouble As Double=Double.Parse(Value,New System.Globalization.CultureInfo(“en-GB”))
MyValue=MyDouble.ToString(“N”和小数,新系统。全球化。文化信息(“en GB”))
'小数确保小数分隔符后有足够的小数
其他的
Dim MyDouble As Double=Double.Parse(Value,New System.Globalization.CultureInfo(“nl-nl”))
MyValue=MyDouble.ToString(“N”和小数,新系统。全球化。文化信息(“nl nl”))
如果结束
如果结束

如果您没有在任何地方引用区域性,则不应该引用,因为您必须为toString提供一个IFormatProvider,这将导致异常:“无法将'System.String'类型的对象强制转换为'System.IFormatProvider'类型。”在我的测试代码中,我没有引用任何特定的区域性。最重要的是:您尝试将字符串格式化为字符串,而不是将数字格式化为字符串。当然,您可以创建自己的格式提供程序来处理字符串。您的整个问题都源于字符串中有一个数值这一事实。这个值首先来自哪里?你不能把它解析成一个合适类型的数字吗?遗憾的是,这不是一个选项,因为我们也对字符串本身进行了一些检查,可能需要替换一些部分等。你需要扩展你的问题,为这些输入提供一些不同的输入和所需的输出,因为不清楚你想要实现什么standsI无法检查字符串中的逗号,因为输入也可能是1216.00、1216.00或1.216,00。那么,您必须知道每个值代表的是哪个语言环境,否则您如何可能解析所有这些?如果此值来自数据库,则应将其存储为数值,而不是字符串