2014-02-19 2 views
0

문자열에 공백이없는 쉼표로 구분 된 수레 만 들어 있는지 확인하려면 어떻게합니까? 다음과 같은 뭔가 : 기본적으로문자열에 쉼표가 쉼표로 구분되어 있는지 확인하십시오.

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이 조건을 만족하지 않는다는 것을 의미합니다. 지금은 문자열이 아니라 정수를 포함 할 수 있음을 참조로, 분명하지 내가 질문의 제목이 꽤 분명했다 생각하지만 :

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가 float에 의해 의미하는 것과 입력에 예상되는 다양성에 달려 있습니다. – sawa

+2

포인트가 있습니다. 나는 여전히'.' 또는'4.'가 유효한 입력이라고 의심한다. – Linuxios

2

어떻게 정규 표현식에 대해 :

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

고마워요.하지만 정수만있는 경우에는 작동하지 않습니다. – user3187131

+0

user3187131, 작동하지 않는 예를 들어주세요. Linuxios는 아마도 음수를 허용합니다. –

+0

@cary : done. 이제 그들을 처리해야합니다. – Linuxios

1

편집 :

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

그래서, 부정을 복용. 음수가 허용되는지 여부는 미확인 상태이지만, -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 

하는 여분의 선행 또는 후행 0, 또는 여분의 공백이있을 경우, 나는이 일을 할 생각 :

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 
관련 문제