Ruby 严格将字符串转换为整数(或零)
对于web编程,数字以字符串形式输入。但是Ruby 严格将字符串转换为整数(或零),ruby,type-conversion,Ruby,Type Conversion,对于web编程,数字以字符串形式输入。但是to_i会将“5abc”转换为5,“abc”转换为0,这两个答案都是错误的。为了抓住这些,我写道: def number_or_nil( s ) number = s.to_i number = nil if (number.to_s != s) return number end 有没有一种更简洁、更自然的方法来完成这种转换并检测字符串不是数字?使用整数(string) 如果字符串无法转换为整数,则会引发ArgumentError错误 I
to_i
会将“5abc”
转换为5
,“abc”
转换为0
,这两个答案都是错误的。为了抓住这些,我写道:
def number_or_nil( s )
number = s.to_i
number = nil if (number.to_s != s)
return number
end
有没有一种更简洁、更自然的方法来完成这种转换并检测字符串不是数字?使用整数(string)
如果字符串无法转换为整数,则会引发ArgumentError错误
Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5
def number_or_nil(str)
str.to_i if str[/^-?\d+$/] and str.line.size == 1
end
如果希望在字符串无法转换时返回nil,那么仍然需要number\u或\u nil方法
def number_or_nil(string)
Integer(string || '')
rescue ArgumentError
nil
end
您应该小心地从特定的异常中拯救出来。一个简单的解救(例如“解救无”)将解救从StandardError继承的任何错误,并可能以您意想不到的方式干扰程序的执行。Integer()将引发ArgumentError,因此请指定
如果您不想处理异常,只想使用较短版本的数字\u或\u nil,您可以利用隐式返回值并将其写成:
def number_or_nil(string)
num = string.to_i
num if num.to_s == string
end
number_or_nil '5' #=> 5
number_or_nil '5abc' #=> nil
这将按照您期望的方式工作。使用简单的正则表达式检查
str
是否为整数
Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5
def number_or_nil(str)
str.to_i if str[/^-?\d+$/] and str.line.size == 1
end
由于至少Ruby 2.6,内核函数Integer、Float等接受执行此任务的
异常关键字参数:
> Integer('42', exception: false)
=> 42
> Integer('x42', exception: false)
=> nil
> Integer('x42')
ArgumentError (invalid value for Integer(): "x42")
> Integer('', exception: false)
=> nil
> Integer('')
ArgumentError (invalid value for Integer(): "")
> Integer(nil, exception: false)
=> nil
> Integer(' 42 ', exception: false)
=> 42
> Integer(' 4 2 ', exception: false)
=> nil
'5'
应该是5
或nil
?问题不清楚。到i
有什么问题?什么是“这种转换”?我期望的是零,尽管我可以接受5。那么'5.0'
或'5.1'
呢?这些绝对是数字,既然你是这样表达问题的,那么这些不也应该转换成整数吗?整数是我唯一关心的,谢谢。就我个人而言,我觉得奇怪的是“to_I”只会愉快地转换字符串的前导部分,而愉快地将“abc”转换为零。。。但目前看来,这样做毫无疑问是有充分理由的。谢谢。由于输入来自网络,您应该更改您的答案,以期待多行内容。str.to_i如果str[/\A\d+\z/]为负整数,空格?修复了它。Me check要求对整数有严格的规则,没有空格,没有换行符。唯一的警告是Integer(nil)
引发TypeError
,因此Integer(string | |“”)
更加一致。我在哪里可以找到Integer(string)
的(官方)文档?据我所知,官方文件中没有提到这一点。官方文档可以在中找到。您可能需要指定基数10Integer('5',10)
,否则如果您得到类似Integer('08')
的内容,它将由于假定了错误的基数而引发错误。现在是brainf*k时间:Integer('0010'))=>8
所以不-你不能只给它一个字符串,然后交叉手指,希望得到最好的结果,因为像前导零这样简单的东西会让该方法假设你在处理二进制数