【问题标题】:Read field as string, even if it is an integer or a float [closed]将字段读取为字符串,即使它是整数或浮点数 [关闭]
【发布时间】:2013-09-22 00:12:31
【问题描述】:

我需要分配一些可以是字符串、整数或浮点数的对象,但我总是需要将它们存储为字符串。

a = myvar.to_s

此解决方案在大多数情况下都有效,但例如当 myvar 为“7.50”时,“a”将为“7.5”

我需要一个与原始小数位数相同的小数位数。有没有办法告诉 ruby​​ 我正在读取的变量将是一个字符串,无论它看起来像什么。

编辑:我正在从 csv 文件导入数据,我正在寻找一种方法来告诉 ruby​​ 它将读取的所有内容都是字符串,无论它看起来像整数还是浮点数。 例如,我可以有“7”、“5.5000”、“5.5”等值。

【问题讨论】:

  • 有点不清楚你在问什么。
  • 您能否添加有关您的数据源的更多详细信息,以及您最初是如何获得Float 的?任何解决方案都可能需要考虑(反)序列化层。如果您希望修改值但保持相同的格式,这可能会变得复杂,您需要知道每个字段的正确格式(包括数字的有效位数)
  • 不能指定浮点数的位数:myvar = 7.50 #=> 7.5
  • @NeilSlater,我编辑了这个问题,试图让它更清楚
  • 您提出的问题说明了我们无法通过自己的方式重现的问题。 OP 可以发布包含重现问题的代码和示例数据的问题,届时我们可以尝试提供帮助。事实上,这个问题没有什么意义,而且因为我们无法重现您所看到的问题,我们无法帮助解决它。请阅读sscce.orgmeta.stackexchange.com/questions/156810/… 来创建一个可以帮助我们帮助您的问题。

标签: ruby string csv


【解决方案1】:

首先请确保您不使用任何CSV converters。因此,例如,而不是:

CSV.parse_line("foo,7,5.5000,5.5", converters: :numeric)
#=> ["foo", 7, 5.5, 5.5]

您只需使用:

CSV.parse_line("foo,7,5.5000,5.5")
#=> ["foo", "7", "5.5000", "5.5"]

完整示例:

require 'csv'
require 'tempfile'

file = Tempfile.new(['foo', '.csv'])
file << "7.50"
file.close

CSV.foreach(file.path) do |row|
  p row[0]
  p row[0].class
end

输出

"7.50"
String

在 Ruby 1.8.7、1.9.3 和 2.0.0 中测试,均返回 "7.50"

【讨论】:

  • 我只是在使用 CSV.foreach(foo) 做 |row| ---- 有区别吗?
  • 不,它采用相同的选项哈希。
  • 如果 csv 中的值为“7.50”,row[0] 为 7.5,row[0].class 为 float。如何告诉它读取 row[0] 作为字符串?
  • @TopperH 我无法重现此内容,请参阅我的编辑。
【解决方案2】:

Ruby 中的浮点精度不能单独调整。换句话说,没有为每个浮点数设置精度的概念。假设您正在尝试将浮点数转换为字符串,您的描述 the same number of decimals as the original one 没有意义,因为没有 the number of decimals of the original float 这样的东西。

如果你想指定一个特定的精度,你只能在浮点数转换为字符串时或之后这样做。

【讨论】:

  • 可能这样的东西,例如“原始序列化浮点数的小数位数”,具体取决于OP的响应。
  • @NeilSlater 我不知道您所说的serialised float 是什么意思。如果你的意思是一个字符串,那么这与我写的并不矛盾。
  • 是的,我的意思是浮点数的字符串表示,我假设 OP 已经获得了数据,并且指的是“原始”。我同意你的帖子从字面上理解这个问题是正确的,所以这不是矛盾,只是一个很可能的并发症。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多