簡體   English   中英

F#從Excel轉換貨幣

[英]F# Converting Currency from Excel

我正在嘗試將Excel工作表中的列轉換為F#應用程序中的浮點數。 問題是我不知道貨幣以哪種格式提供。 可以手動鍵入,帶或不帶符號,當然也可以帶。 和,符號總是一團糟。

是否有任何“簡短而甜美”的方式來警告似乎與實際浮點值無關的可能性數組,這些浮點值隨后在經過一些算術運算后可以打印為貨幣?

我遇到的一個附加問題:當Excel中的列標記為Number 600.00時,將通過互操作庫導出為600;否則,將通過interop庫導出。 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類型,添加此類型的列並在需要時進行保存。
  • 我從字符串中刪除了所有其他符號,只保留了分隔符。 (就像答案彼得一樣)
  • 在相同的上下文和應用程序中運行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

像這樣嗎

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

結果:

已轉換為“ 1,097英鎊”。 至1097.00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM