2014-02-19 2 views
0

Как проверить, содержит ли строка только поплавки, разделенные запятыми без пробела. Что-то, как показано ниже:Проверьте, содержит ли строка только поплавки, разделенные запятыми в Ruby

str = "0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489" #true 
str = "0.068798716758f1341,0.120311605902415, 89.8399554017928,198.151088713489" #False because of "f" in the first value. 
str = "0.0687987167581341 0.120311605902415" # False because of no space and comma. 

В принципе, как я могу проверить, является ли строка в следующей форме:

str = "<value>,<value>,<value>" # where value may only contains, integers, floats. 

ответ

1

Если следующие матчи , то это означает, что str не удовлетворяет условию.

str =~ /[^\d.,]/ 

Таким образом, принимая отрицание:

re = /[^\d.,]/ 
"0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489" !~ re 
# => true 
"0.068798716758f1341,0.120311605902415, 89.8399554017928,198.151088713489" !~ re 
# => false 
"0.0687987167581341 0.120311605902415" !~ re 
# => false 
+1

Это сообщение допустимо для строки типа 'str =..,., 4.," '. Я не думаю, что это так. – Linuxios

+0

@ Linuxios. Это зависит от того, что OP означает поплавок и сколько разнообразия следует ожидать во входе. – sawa

+2

У вас есть точка. Я все еще сомневаюсь, что '.' Или '4.' являются действительными вводами. – Linuxios

2

Как об этом регулярное выражение:

str.split(',').all? {|val| val =~ /\A-?\d+(\.\d+)?\Z/} 
+0

Спасибо, что это работает, но не тогда, когда есть только целое число. – user3187131

+0

user3187131, пожалуйста, приведи пример, где он не работает. Linuxios, возможно, допускают отрицательные числа. –

+0

@cary: сделано. Он должен справиться с ними сейчас. – Linuxios

1

Edit: Я думал, что название этого вопроса было довольно ясно, но, очевидно, не так, как я теперь вижу, что строка может содержать целые числа. Разрешены ли отрицательные числа, остается недосказанным, но -2.1 является поплавком, а -3 является целым числом. В любом случае мое решение работает только для поплавков, хотя было бы непросто его модифицировать, чтобы также использовать целые числа, но это было бы слишком грязно, чтобы беспокоиться.

Я предпочитаю решение @Linuxios, но я упомянул еще один подход в интересах разнообразия. Если мы не обеспокоены возможностью дополнительной передней или задней нулей, это должно работать:

str = "0.0687987167581341,0.120311605902415,89.8399554017928,198.151088713489" 

str.split(',').all? { |s| s.to_f.to_s == s.strip } 
    #=>true 

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

str.split(',').all? {|s| s.to_f.to_s == 
    s.match(/^\s*(-)?\s*?0*?(0.\d+?|[1-9]\d*\.\d+?)0*\s*$/)[1..-1].join 
Смежные вопросы