Удаление первого символа строки - PullRequest
4 голосов
/ 29 августа 2010

у меня

string = "$575.00 "
string.to_f
// => 0.0

string = "575.00 "
string.to_f
// => 575.0

значение поступает в этом формате, и мне нужно вставить в поле базы данных, которое является десятичным, любые предложения

"$575.00 " 

Ответы [ 5 ]

5 голосов
/ 29 августа 2010

Мы делали это так часто, что написали расширение для String, которое называется cost_to_f:

class String
  def cost_to_f
    self.delete('$,').to_f
  end
end

Мы храним такие расширения в config/initializers/extensions/string.rb.

Вы можете просто позвонить:

"$5,425.55".cost_to_f   #=> 5425.55

Если вы редко используете этот метод, лучше всего просто создать функцию, так как добавление функций в базовые классы не совсем то, что я бы порекомендовал слегка:

def cost_to_f(string)
  string.delete('$,').to_f
end

Если вам это нужно в более чем одном классе, вы всегда можете поместить его в модуль, а затем include в тот модуль, где вам это нужно.

<ч />

Еще один лакомый кусочек. Вы упомянули, что вам нужно обработать эту строку, когда она записывается в базу данных. С ActiveRecord лучший способ сделать это:

class Item < ActiveRecord::Base
  def price=(p)
    p = p.cost_to_f if p.is_a?(String)  
    write_attribute(:price, p)
  end
end
<ч />

РЕДАКТИРОВАТЬ : Обновлено для использования String#delete!

3 голосов
/ 29 августа 2010

Так много ответов ... я постараюсь обобщить все, что доступно сейчас, прежде чем дать собственный ответ.

1. string.gsub(/[\$,]/, '')
   string.gsub!(/^\$/, '')
2. string[1..-1]
3. string.slice(0) # => "ome string"
4. s/^.//
  1. Почему (g)sub и регулярное выражение Просто для удаления символа?String#tr быстрее и короче.String#delete еще лучше.
  2. Хорошо, быстро, просто.Мощность обратного индексирования.
  3. Хм ... похоже, что он возвращает "S".Потому что это псевдоним String#[]
  4. Perl?/ я проверяю теги вопросов ...

И мой совет: что если у вас есть не доллар, а йена?Или что, если у вас ничего нет до чисел?Поэтому я предпочту:

string[/\d.+/]

Это обрезает лидирующие недесятичные символы, которые мешают to_f работать хорошо.

PS: Кстати.Известно, что float - плохая практика для хранения денежных сумм. Использовать число с плавающей запятой или десятичную для расчета суммы в долларах для приложения учета?

0 голосов
/ 29 августа 2010

Я бы использовал (вместо регулярных выражений) просто встроенный метод slice! в классе String.Например,

s = "Some string"
s.slice!(0) # Deletes and returns the 0th character from the string. 
s # => "ome string"

Документация здесь.

0 голосов
/ 29 августа 2010

Вы можете попробовать что-то вроде этого.

string = string[1..-1] if string.match(/^\$/)

Или вот это.

string.gsub!(/^\$/, '')

Не забудьте поместить этот обратный слеш в Regexp, это также означает «конец строки».

0 голосов
/ 29 августа 2010

Вы можете использовать регулярные выражения для этого:

s/^.//

Как правило, это синтаксис PCRE.

В Ruby вы можете использовать метод sub() класса string для замены строки:

result = string.sub(/^./,"")

Это должно работать.

[EDIT]

Хорошо, кто-то спросил, для чего предназначен gsub():

gsub() действует как sub(), но с модификатором /g в PCRE (для глобальной замены):

s/a/b/

в PCRE составляет

string.sub(/a/, "b")

и

s/a/b/g

есть

string.gsub(/a/, "b")

в рубине

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...