switch v.(type) {
case int, int8, int16, int32, int64, ...:
...
}
On Mon, Jun 4, 2012 at 5:42 PM, Holger Knauer
<
holger...@googlemail.com> wrote:
> I've written a function to be called from templates which is supposed to do
> number formatting according to a given language (to choose appropriate runes
> for the decimal separator and number grouping).
> Inside the template it's supposed to be invoked like this
> {{fmtDecimal "en" 2 .SomeValueOfPotentiallyAnyNumericType}}
>
> The fmtDecimal function internally calls a function with this signature to
> do the real string formatting:
> func Number(amount float64, decimals int, l i18n.Language) string
>
> What I came up with for fmtDecimal looks like this:
>
> func fmtDecimal(args ...interface{}) string {
> if len(args) != 3 {
> return "fmtDecimal expects three arguments: language, decimals, value"
> }
> if l, ok := args[0].(string); ok {
> lang := i18n.Language(l)
> if decimals, ok := args[1].(int); ok {
>
> if arg, ok := args[2].(int); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(int8); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(int16); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(int32); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(int64); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(uint); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(uint8); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(uint16); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(uint32); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(uint64); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(float32); ok {
> return format.Number(float64(arg), decimals, lang)
> }
> if arg, ok := args[2].(float64); ok {
> return format.Number(arg, decimals, lang)
> }
> return "fmtNumber/fmtDecimal expects a numerical value to format"
> }
> return "fmtNumber/fmtDecimal expect second argument to be of type int"
>
> }
> return "fmtNumber/fmtDecimal expect first argument to be a string"
> }
>
>
> I wonder if there's any more elegant, less verbose way of converting an
> interface{} supposed to represent one of the available numerical types to
> the float64 type needed?
>
> Thanks,
> Holger