【问题标题】:VBA Double as String with comma and not pointVBA Double as String,带逗号而不是点
【发布时间】:2015-01-12 15:29:11
【问题描述】:

我正在寻找将双精度数转换为字符串的解决方案,但字符串的小数位前应该有逗号,而不是点。

“一个半”应该是 1,5(德语符号)。

感谢您的帮助!!

【问题讨论】:

    标签: vba excel format


    【解决方案1】:

    CStr 和 Replace 的组合可以完成这项工作。

    Function Dbl2Str(dbl As Double) As String
        Dbl2Str = Replace(CStr(dbl), ".", ",")
    End Function
    

    【讨论】:

    • 如果您在英格兰运行此程序,如果原始数字是 1234.56 并且用户设置了千位分隔符,您最终可能会得到类似“1,234,56”的结果。
    【解决方案2】:

    不幸的是,在 VBA 中,您无法轻松编写与语言环境无关的代码。也就是说,当您进行 CStr 演员表时,您不能指定语言环境。

    一种解决方法是将 0.5 之类的双精度数转换为字符串,然后查看最终结果。如果您以 0,5 结尾,那么您处于德语(等)语言环境中,您无需执行任何其他操作。

    如果您最终得到0.5,那么您知道您需要进行转换。然后你只需要遍历你的字符串,用逗号替换点,反之亦然(反之亦然,以防你的字符串有数千个分隔符)。你可以使用Replace

    【讨论】:

    • 我认为这并不完全正确。 Language Settings are available through the application object(至少在 excel 中)并通过 MsoLanguageId Enumeration 暴露给客户。
    • 您是否建议基于 MsoLanguageId 枚举上的开关的解决方案?
    • 不一定,但也许。我只是觉得声称“你不能编写独立于语言环境的代码”有点可疑。
    • @RubberDuck 对于像 Val() 这样的非 excel 函数,这些设置将被忽略。我们仍然需要一种方法来使用这些类型的函数而不依赖于语言环境。
    【解决方案3】:

    根据 RubberDuck 的评论,我得到了这样的结果:

    Function DblToStr(x As Double)
     DblToStr = CStr(x)
    
     If (Application.ThousandsSeparator = ".") Then
      DblToStr = Replace(DblToStr, ".", "")
     End If
     If (Application.DecimalSeparator = ".") Then
      DblToStr = Replace(DblToStr, ".", ",")
     End If
    
    End Function
    

    【讨论】:

      【解决方案4】:

      然后是这样的

      Dim somestring As String
      Dim someDec As Double
      
      someDec = 1.5
      somestring = CStr(someDec)
      somestring = Replace(somestring, ".", ",")
      MsgBox (somestring)
      

      【讨论】:

      • 如果您在英格兰运行此程序,如果原始数字是 1234.56 并且用户设置了千位分隔符,您最终可能会得到类似“1,234,56”的结果。
      • 有趣的一点,虽然它给出了要转换的数据类型已经是双精度数。我不相信逗号可以存在于双精度中,但我不知道这在欧洲是否也是如此。
      【解决方案5】:

      选择您要转换的单元格并运行这个小宏:

      Sub changeIT()
          For Each r In Selection
              t = r.Text
              If InStr(1, r, ".") > 0 Then
                  r.Clear
                  r.NumberFormat = "@"
                  r.Value = Replace(t, ".", ",")
              End If
          Next r
      End Sub
      

      只有那些带有 "." 的单元格会改变,它们将是 Strings 而不是 Doubles

      【讨论】:

        【解决方案6】:

        我检查了其他答案,但最终编写了自己的解决方案,使用以下代码将1500.5 等用户输入转换为1,500.50

        '
        ' Separates real-numbers by "," and adds "." before decimals
        '
        Function FormatNumber(ByVal v As Double) As String
            Dim s$, pos&
            Dim r$, i&
        
            ' Find decimal point
            s = CStr(v)
            pos = InStrRev(s, ".")
            If pos <= 0 Then
                pos = InStrRev(s, ",")
                If pos > 0 Then
                    Mid$(s, pos, 1) = "."
                Else
                    pos = Len(s) + 1
                End If
            End If
        
            ' Separate numbers into "r"
            On Error Resume Next
            i = pos - 3
            r = Mid$(s, i, 3)
            For i = i - 3 To 1 Step -3
                r = Mid$(s, i, 3) & "," & r
            Next i
            If i < 1 Then
                r = Mid$(s, 1, 2 + i) & "," & r
            End If
        
            ' Store dot and decimal numbers into "s"
            s = Mid$(s, pos)
            i = Len(s)
            If i = 2 Then
                s = s & "0"
            ElseIf i <= 0 Then
                s = ".00"
            End If
        
            ' Append decimals and return
            FormatNumber = r & s
        End Function
        

        【讨论】:

        • 如果对其他方式感兴趣(将字符串转换为数字),请查看ParseNumber(...)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 2021-06-28
        • 2016-07-01
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多