Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 严格将字符串转换为整数(或零)_Ruby_Type Conversion - Fatal编程技术网

Ruby 严格将字符串转换为整数(或零)

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

对于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错误

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)
的(官方)文档?据我所知,官方文件中没有提到这一点。官方文档可以在中找到。您可能需要指定基数10
Integer('5',10)
,否则如果您得到类似
Integer('08')
的内容,它将由于假定了错误的基数而引发错误。现在是brainf*k时间:
Integer('0010'))=>8
所以不-你不能只给它一个字符串,然后交叉手指,希望得到最好的结果,因为像前导零这样简单的东西会让该方法假设你在处理二进制数