0


0

Rubyで値と単位を分割する

値と単位を分割する最もエレガントな方法は何ですか?

13min.some_method["value"] = 13
13min.some_method["unit"] = "min"

unpackまたはsplitを使用する必要があると思いますが、機能させることができます!

2 Answer


8


String#scanの場合:

>> "13min".scan(/\d+|[^\d]+/)
=> ["13", "min"]

別の方法:

>> i = "13min" =~ /[^\d]/
=> 2
>> "13min"[0,i]
=> "13"
>> "13min"[i,"13min".length]
=> "min"

String#splitが最適ではない理由は、区切り文字を削除するためですが、2つの文字列は互いに突き合わされます。


2


試してみてください(フロートと負の数でも動作します)。

s = "-123.45min"

value = s.to_f          # => -123.45
unit = s[/[a-zA-Z]+/]   # => "min"

Rubyの to_f`および to_i`メソッドと同様に、結果を取得するために「試行」するだけです。 したがって、ユニットを指定しない場合、「unit」は「nil」になります。ユニットのみを指定する場合、値は0になります。

"123-34min"    value = 123,     unit = "min"
"min"          value = 0        unit = "min"
"-1234"        value = -1234    unit = nil
"123-foo-bar"  value = 123      unit = "foo"

P.S. もちろん、これはユニットに数字がないことを前提としています。