F#从Excel转换货币

时间:2015-11-15 13:31:53

标签: excel f# currency

我正在尝试将Excel工作表中的列转换为我的F#应用程序中的浮点数。问题是我不知道货币的供应格式。这可以手动输入,带或不带符号,当然也可以。而且,符号总是一团糟。

是否有任何“简短而又甜蜜”的方法可以将实际浮点值看似无关紧要的数组进行战争,以后可以将某些算术打印为货币?

我遇到过的一个问题: 当Excel中的列标记为 Number 时,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相同。

扩展Petr的答案:

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 个答案:

答案 0 :(得分: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

结果:

  

转换'£1,097。'到1097.00