2017-02-15 13 views
4

文字列に数字だけが含まれているかどうかを調べるいい方法を見つけようとしています。これは私の努力の結果であるが、それは本当に冗長なようだ:例えばF#文字列に数字だけが含まれているかどうかを調べる

let isDigit c = Char.IsDigit c 

let rec strContainsOnlyNumber (s:string)= 
    let charList = List.ofSeq s 
    match charList with 
     | x :: xs -> 
      if isDigit x then 
       strContainsOnlyNumber (String.Concat (Array.ofList xs)) 
      else 
       false 
     | [] -> true 

私が戻って文字列にし、リストをchar型とする文字列を変換する必要があることは本当に醜いようです。 もっと良い解決策を見つけられますか?

+3

この宿題はありますか?いずれにしても、私は 'Seq.forall'を使います。 – kvb

+1

うわー、それは宿題だと言いましょうが、実際はC#から切り替えるだけです。 Seq.forall(fun elem - > isDigit elem) "12345"これはうまく動作しています。 – Zeta

+8

'' Seq.forall Char.IsDigit "12345"に短縮できます。中間の 'isDigit'関数を必要としません。 –

答えて

3

これにはいくつかの方法があります。あなたがしたい場合は

let strContainsOnlyNumber (s:string) = s |> Seq.forall Char.IsDigit 

System.Stringはあなたが現在リストに変身するために使用している文字の配列であることを、あなたはリストの変換をスキップしてちょうど直接テストにSeq.forallを使用することができます考える

それは有効な数値だ場合、あなたは直接番号にそれを解析することができます参照してください。これはまた-が含まれている("-342"のようなもののためにtrueを返しますが、有効な無感覚であるということ

let strContainsOnlyNumber (s:string) = System.Int32.TryParse s |> fst 

は注意エル)。

別のアプローチは、正規表現を使用することです:

let numberCheck = System.Text.RegularExpressions.Regex("^[0-9]+$")  
let strContainsOnlyNumbers (s:string) = numberCheck.IsMatch s 

また、これは数字を処理しますが、必要に応じて数字で、他の記号が含まれるように適合させることができます。

目標は、後数として文字列を使用する場合は、私の提案はただの変換を行うためにも、そしてオプションで店舗になります。

let tryToInt s = 
    match System.Int32.TryParse s with 
    | true, v -> Some v 
    | false, _ -> None 

これはあなたがかどうかを確認することができます値は数字(Option.isSome経由)、結果を使用するためのパターンマッチングなどがあります。

浮動小数点数への変換はほぼ同じです。floatの値を処理する場合は、Int32.TryParseDouble.TryParseに変更してください。

関連する問題