我試圖將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
可以使用Double.TryParse()用的NumberStyles和文化的不同組合超載:https://msdn.microsoft.com/en-us/library/3s27fasw(v=vs.110)。aspx – Petr
我不知道格式提前。更重要的是,我不知道每張紙上的格式。這就是爲什麼我在尋找一個非常普遍的「始終」工作方法 –
在這種情況下,可能沒有「始終」的工作解決方案。在某些文化中,''可能是千分之一 - 在其他地方,它被用作小數點。如果數字是用中文數字寫的? – Petr