【问题标题】:How to get TrimEnd() to stop at a specific character如何让 TrimEnd() 在特定字符处停止
【发布时间】:2018-06-04 07:17:47
【问题描述】:

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

Percentage
_____________
100.00000
50.00000
74.02500

当我在屏幕上显示这些值时,我想从字符串末尾修剪掉不必要的零以及小数点,这样上面的例子就变成了:

Percentage
_____________
100
50
74.025

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

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

但如果有额外的零,此代码将继续修剪小数点后。我也试过了:

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

这几乎可以工作。它只留下小数点。

有没有办法使用 TrimEnd() 做我想做的事,还是我需要切换到正则表达式?

【问题讨论】:

  • 由于您显示货币值(可能是decimal),以所需的方式将它们转换为字符串。不要错误地转换它们,然后尝试修复它。我们需要知道您在哪里/如何从数据库中读取值,以及您在哪里/如何在屏幕上显示它们。
  • @TimSchmelter - 我实际上解决了货币问题(我已经更新了我的问题以反映这一点),但我仍然遇到百分比问题。由于我从数据库中提取,我的代码看起来像 `reader.Item("Percent").ToString("E") 并且我收到错误消息说输入字符串的格式不正确。
  • reader.Item 返回没有带参数的 ToString 重载的对象。你必须使用 reader.GetDecimal 或 reader.GetDouble 然后使用它

标签: vb.net trim


【解决方案1】:

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

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

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

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

【讨论】:

  • 不知道为什么,但我什至没有想过要使用 TrimEnd() 两次。我一直在尝试找到一种方法将它们全部塞进一个。
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多