如何让 TrimEnd() 在特定字符处停止

How to get TrimEnd() to stop at a specific character

我在数据库中保存了一系列百分比值,如下所示:

Percentage
_____________
100.00000
50.00000
74.02500

当我在屏幕上显示这些值时,我想 trim 字符串末尾不必要的零和小数点,所以上面的例子变成:

Percentage
_____________
100
50
74.025

我目前正在使用以下代码:

displayVal = rawVal.TrimEnd({"0"c, "."c})

但如果有额外的零,此代码会继续到小数点后的 trim。我也试过:

displayVal = rawVal.TrimEnd(New String({"0", "."}))

这几乎行得通。它只保留小数点。

有没有办法使用 TrimEnd() 来完成我想做的事情,或者我是否需要切换到正则表达式?

正如蒂姆在评论中已经提到的,如果数据库中的数据类型已经是某种数字类型,最好将其保留为该类型,然后在将其转换为字符串时使用适当的数字格式输出。但是,如果输入数据已经是一个字符串,那么这不是一个选项。在那个演员表中,最简单的选择是连续进行两次修剪,如下所示:

Private Function RemoveUnecessaryZeros(input As String) As String
    Return input.TrimEnd("0"c).TrimEnd("."c)
End Function

但是,这不会给您很大的灵活性,它不会删除前面的零,也不会使用当前区域性重新格式化字符串。如果这很重要,您可以改为将该值解析为数字类型,然后使用所需的字符串格式化选项将其重新输出为字符串。例如:

Private Function RemoveUnecessaryZeros(input As String) As String
    Dim result As Double
    If Double.TryParse(input, result) Then
        Return result.ToString()
    Else
        Return input
    End If
End Function

但是,当您这样做时,您可能会在此过程中失去精度,具体取决于输入数字和您选择用来解析它的数据类型。如果您需要对 parsing/reformatting 进行更多控制,并且希望将其纯粹保留在字符串中以免丢失精度,那么您可能需要考虑使用正则表达式。例如:

Private Function RemoveUnecessaryZeros(input As String) As String
    Dim m As Match = Regex.Match(input, "[1-9]\d*(\.([1-9]|0+[1-9])+)?")
    If m.Success Then
        Return m.Value
    Else
        Return input
    End If
End Function