2015-06-09 6 views
0

Weird наблюдения здесь:Удалить запятой из строки в Ruby, затем отливали в целое

2.0.0-p353 :016 > "1,056".gsub!(/,/,'').to_i 
=> 1056 
2.0.0-p353 :017 > "955".gsub!(/,/,'').to_i 
=> 0 

Есть ли способ, чтобы последовательно делать это, не нарушая числа, которые не поле в них ,?

+5

'gsub!', Как и многие другие методы bang, возвращает 'nil', если никаких изменений не сделано. –

+2

Зачем вам нужно мутировать строку перед преобразованием ее в целое? –

+0

@CarySwoveland, потому что «1,056» .to_i не работает. – randombits

ответ

1

Я предположил, требование было:

  • приемником является строка удерживается переменным (как нет смысла мутирует приемник, если это строка символов);
  • запятые, если они есть, должны быть удалены из приемника (то есть приемник должен быть мутирован); и
  • приемник должен быть преобразован в целое число и целое число.

Один из способов сделать это заключается в следующем:

str = "955" 
str.tap { |s| s.delete!(',') }.to_i 
    #=> 955 
str 
    #=> "955" 

str = "1,955" 
str.tap { |s| s.delete!(',') }.to_i 
    #=> 1955 
str 
    #=> "1955" 

str = "1,955,658" 
str.tap { |s| s.delete!(',') }.to_i 
    #=> 1955658 
str 
    #=> "1955658" 
+0

Не используйте 'split (','). Join'. Вместо этого используйте 'delete (','). To_i'. Это в 2 раза быстрее. –

+0

randombits, я полностью согласен с @theTinMan (но не из-за результатов тестов). Я предлагаю вам переместить галочку в ответ. Мой первоначальный ответ мутировал строку, чтобы удалить запятые и вернуть целочисленное значение. Я думал, это именно то, что вы специально хотели. Я играл с другими методами и как-то наполовину забыл о необходимости мутировать строку. :-) 'split (','). join' не является ни рыбой, ни фолом: он не мутирует приемник и не уступает' delete', если приемник не должен быть мутирован. Я вернусь к своему первоначальному ответу, немного улучшился. –

1

Вздох ... контрольные показатели людей ...

require 'fruity' 

NUM = '1,234,567,890' 

compare do 
    _delete { NUM.delete(',').to_i } 
    _gsub { NUM.gsub(',', '').to_i } 
    _scan {NUM.scan(/\d+/).join.to_i } 
    _split { NUM.split(',').join.to_i } 
end 
# >> Running each test 4096 times. Test will take about 1 second. 
# >> _delete is faster than _split by 2.4x ± 0.1 
# >> _split is faster than _gsub by 10.000000000000009% ± 1.0% 
# >> _gsub is faster than _scan by 2.2x ± 0.1 

Другими словами, используйте delete(',') удалить, ограничивающей запятые и затем преобразовать полученную строку в целое число. Не разбивайте его на массив, а затем снова присоединяйте его, не отсканируйте его в массив и не позволяйте gsub конвертировать ',' в регулярное выражение, а затем заменить все совпадения на ''.