【问题标题】:How to avoid octal, binary, etc. numbers changing output during string conversion字符串转换时如何避免八进制、二进制等数字改变输出
【发布时间】:2016-04-21 10:35:02
【问题描述】:

我正在开发一个使用 Luhn Algorithm 的 codewars kata 验证信用卡号码。已经有了我的答案,它使用字符串转换来拆分数字,然后重新转换为整数,然后使用算法的其余部分。一切都很好,直到我用八进制数测试它。

代码开头为:

def validate(n)
 n.to_s.split("") #n = 7867 gives me ["7","8","6","7"], which is fine
 n.to_s.split("") #n = 0776 gives me ["5","1","0], when I need ["0","7","7","6"]
 n.to_s.split("") #n = 0100 gives me ["6", "4"] when I need ["0","1","0","0"]
#other code here
end

应该在插入n 的任何地方调用该方法。

如何防止八进制、二进制或十六进制等数字进行这样的转换?有没有办法让数字保持原样以便我可以使用它们?

【问题讨论】:

  • 你从哪里得到n 的值?
  • n 就是插入方法中的任何数字。 def validate(n)
  • 我的意思是你如何得到八进制数?您是否在程序中输入数字文字?
  • 我只是随机选择数字插入以测试我的程序。每当我输入带有0 的数字时,我都不知道发生了什么,直到我插入0905 并且错误显示为invalid octal number,我了解到八进制甚至是一回事。

标签: ruby integer octal


【解决方案1】:

您的问题是您显然将数字存储为数字,在n;否则你不需要说n.to_s

必须有一个地方让这些数字进入你的程序;用户提示,或通过读取文件或其他方式。您可能在某处有类似n = user_input.to_i 的东西,迫使ruby 将字符串转换为数字。确保在任何地方都将n 视为字符串,并且前导零会一直存在。

【讨论】:

  • 这是 kata 的一部分。我编辑了这个问题以明确这一点。这只是弄乱结果的方法的一部分。那么,将 'n' 转换为整数,然后将其拆分为字符串是否有效?
  • 这不是重点。如果要处理前导零,则不能将 n 转换为数字类型 - 它们都不会保留零。您的问题不是在您在此处发布的方法中,而是在n 来自的地方。
  • 哦,我明白了。谢谢!
【解决方案2】:

如果你在你的程序中使用数字文字,你可以明确地说它们是十进制的:

n = 0d0100 # or "0100".to_i
n.to_s.rjust(4,"0").split("")
#=> ["0", "1", "0", "0"]

另外,使用rjust 将它们设为字符串形式的 4 位数字,因为信用卡/借记卡有四个 4 位数字


要将信用卡拆分为整数数组,您可以执行以下操作:

cc = "4111 1111 1111 1111".gsub(/ /,"").split("").map(&:to_i)
#=> [4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

【讨论】:

  • 哦,我明白你所说的数字文字是什么意思(我根本没有数学头脑)它们不是浮点数或小数。它们只是多位整数。
  • @siouxsie,它们甚至不是整数,它们只是由数字组成的字符串(可能空格也很好)。任何地方都不适合将信用卡号码转换为整数或其他数字类型。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2021-02-24
相关资源
最近更新 更多