3

次のようないくつかの異なるXMLデータベースダンプからインポートされたハッシュの行があります(ただし、キーは異なります)。

{"Id"=>"1", "Name"=>"Cat", "Description"=>"Feline", "Count"=>"123"}

使用してみましたが、数値以外の文字列を次#to_iのように変換します。0

"Feline".to_i
# => 0

しかし、私が欲しいのは"Feline"、文字列を維持する方法ですがIdCount上記の例では、整数1と。になります123

数値である文字列値のみを整数に変換する簡単な方法はありますか?

4

7 に答える 7

9

一行の答え:正規表現アプローチの使用

h.merge(h) { |k, v| v.match(/\A[+-]?\d+?(\.\d+)?\Z/) ? v.to_i : v }

整数アプローチの使用

h.merge(h) { |k, v| Integer(v) rescue v }
于 2012-09-07T12:38:53.810 に答える
7

Kernel#Integerを使用:

my_hash = {"Id"=>"1", "Name"=>"Cat", "Description"=>"Feline", "Count"=>"123"}
Hash[ my_hash.map{ |a, b| [ a,
                            begin
                              Integer b
                            rescue ArgumentError
                              b
                            end ] } ]

後で追加: 私のy_support宝石を使用すると、ハッシュ操作をさらに簡潔にすることができます。

require 'y_support/core_ext/hash'
my_hash.with_values { |v| begin
                            Integer b
                          rescue ArgumentError
                            b
                          end }

YSupportによってインストールでき、、 、gem install y_supportも提供されます。これは、期待どおりの動作をし、バイナリ ブロックが値のペアを返し、その場でハッシュを変更することを期待します。将来、そのようなメソッドを Ruby コアに直接追加するという提案がありました。Hash#with_keysHash#with_values!Hash#with_keys!Hash#modify

于 2012-09-07T12:26:20.950 に答える
1

どのフィールドが整数であるべきかを知っていると思います (使用するコードはおそらくそれに依存します) ので、特定のフィールドを変換することをお勧めします。

c = Hash[h.map { |k,v| [k, %w(Id Count).include?(k) ? Integer(v) : v ] }]
于 2012-09-07T12:47:53.887 に答える
0

これは、整数だけでなくすべての数値を処理します。

my_hash = {"Id"=>"1", "Name"=>"Cat", "Description"=>"Feline", "Count"=>"123"}

result = my_hash.inject({}) { |result,(key,value)|
    if value.match(/^\s*[+-]?((\d+_?)*\d+(\.(\d+_?)*\d+)?|\.(\d+_?)*\d+)(\s*|([eE][+-]?(\d+_?)*\d+)\s*)$/)
            result[key.to_sym] = value.to_i
    else
            result[key.to_sym] = value
    end
    result
}

おかげで、文字列が正規表現の有効な浮動小数点値であるかどうかを判断してください

于 2012-09-07T12:43:06.493 に答える
0

正規表現と三項演算子を使用すると、これをロジックのどこかに組み込むことができます。

string =~ /^\d+$/ ? string.to_i : string
于 2012-09-07T12:29:46.593 に答える
-1

String の新しいメソッドを定義します: String#to_number

class String
  def to_number
    Integer(self) rescue Float(self) rescue self
  end
end

試して:

"1".to_number => 1
"Cat".to_number => "Cat"
于 2013-04-18T12:48:48.387 に答える