2015-11-15 77 views
0

我試圖將Excel工作表中的列轉換爲我的F#應用程序中的浮動。問題是我不知道以何種格式提供貨幣。這可以手動鍵入,有或沒有符號,當然也可以。而且,符號總是一團糟。F#將貨幣從Excel轉換爲

有沒有什麼「簡短而甜蜜」的方式來對付一種看起來與實際浮點值無關的一系列可能性,後面的某些算術可以打印爲貨幣?

我遇到的一個側面問題: 當Excel中的一列被標記爲 600.00將通過互操作庫導出爲600; 534.20將出口爲534.2 一個簡單的解析。符號是不夠的。

未顯示的符號是Excel將通過互操作庫導出爲(後面有空格)。

這些選項不活像:

let ParseFloat1 (o:obj) = 
    float (o.ToString()) 


let parseFloat2 (o:obj) = 
    float (System.Single.Parse(o.ToString())) 

這些嘗試我只是瘋了,開始russamafuzzin'解決方案之後,即使沒有這條龍是一個壞主意的工作:

let ParseFloat o = 
    // ugly 
    let mutable _string = o.ToString() 

    // because of the weird "lets leave trailing zero's off behavior 
    let changeString (s:string) = 
     match s.LastIndexOf "." with 
     | 0 | -1 -> s + "00" 
     | 1 -> s + "0" 
     | _ -> s 

    _string <- changeString _string 

    let characters = _string.ToCharArray() 
    // remove all the non numbers from the string 
    let rec parse source dest = 
     match source with 
     | h::t -> 
        match h with 
        | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0' -> parse t (dest + h.ToString()) 
        | _ -> parse t dest 
     | _ -> dest 

    let _float = parse (Array.toList characters) "" 
    let result = (float (System.Single.Parse(_float)))/(float 100) 
    result 

我真的希望有人能幫助我,因爲這讓我瘋狂。先謝謝你。

編輯(16-11-2015):在有效的意見後

更多的信息,我感謝所有幫助和意見。

我已經將問題分解爲更多的「部分」,所以我爲這個應用程序引入了一些約定。我想,沒有針對問題沒有解決,所以我需要把一些限制和希望最好...

  • 我從CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator得到小數點符號,並確保列在Excel表的鍵入Number,添加此類型的列並在需要時重新保存。
  • 我從字符串中刪除所有其他符號,只留下分隔符。 (就像答案Petr
  • 在相同的上下文中運行Excel,並確保CultureInfo是相同的應用程序。

爲了擴大對切赫的回答是:

let ParseFloat o = 
    let decimalSeparator = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 
    let newv = String((o.ToString()) |> Seq.filter (fun c -> Char.IsNumber c || c = decimalSeparator) |> Array.ofSeq) 
    let rslt = match Double.TryParse(newv) with 
       | true, number -> (float number) 
       | false, _ -> throw "Cannot parse the number" 
    rslt 
+1

可以使用Double.TryParse()用的NumberStyles和文化的不同組合超載:https://msdn.microsoft.com/en-us/library/3s27fasw(v=vs.110)。aspx – Petr

+0

我不知道格式提前。更重要的是,我不知道每張紙上的格式。這就是爲什麼我在尋找一個非常普遍的「始終」工作方法 –

+2

在這種情況下,可能沒有「始終」的工作解決方案。在某些文化中,''可能是千分之一 - 在其他地方,它被用作小數點。如果數字是用中文數字寫的? – Petr

回答

1

像這樣的事情?

open System 
let value = "£1,097." 
let newv = String(value |> Seq.filter (fun c -> Char.IsNumber c || c = '.') |> Array.ofSeq) 
let rslt = match Double.TryParse(newv) with 
      | true, number -> printfn"Converted '%s' to %.2f" value number 
      | false, _ -> printfn "Unable to convert '%s'" value 

結果:

轉換 '£1097'。到1097.00

+0

這很可愛!就像一個魅力,我只是「交換」出來。對於一個,當它在另一個文化中運行時。非常感謝,並作爲一個附註,非常漂亮的代碼;將這個管子包裹在ctor中,從來沒有嘗試過。 –