Quiero escribir una función que formato int y decimal de manera diferente en la cadena de

Tengo este código:

y quiero volver a escribir a los medicamentos genéricos:

    public static string FormatAsIntWithCommaSeperator(int value)
    {
        if (value == 0 || (value > -1 && value < 1))
            return "0";
        return String.Format("{0:#,###,###}", value);
    }

    public static string FormatAsDecimalWithCommaSeperator(decimal value)
    {
        return String.Format("{0:#,###,###.##}", value);
    }


    public static string FormatWithCommaSeperator<T>(T value) where T : struct
    {
        string formattedString = string.Empty;

        if (typeof(T) == typeof(int))
        {
            if ((int)value == 0 || (value > -1 && value < 1))
            return "0";

            formattedString = String.Format("{0:#,###,###}", value);
        }

        //some code...
    }

    ///<summary>
    ///If the number is an int - returned format is without decimal digits
    ///</summary>
    ///<param name="value"></param>
    ///<returns></returns>
    public static string FormatNumberTwoDecimalDigitOrInt(decimal value)
    {
        return (value == (int)value) ? FormatAsIntWithCommaSeperator(Convert.ToInt32(value)) : FormatAsDecimalWithCommaSeperator(value);
    }

¿Cómo puedo usar la T en el cuerpo de la función?

Lo sintaxis debo usar?

Por qué no sólo tiene dos sobrecargas? Supongo que hay una razón para esto, pero a partir de su ejemplo prefiero tener dos métodos en lugar de cambiar el tipo.
¿Por qué utilizar genéricos aquí? Es tu método utilizable para CUALQUIER estructura, incluso para uno que me define a mí mismo?
Los genéricos no son útiles aquí, usted podría utilizar objeto como el tipo de argumento. Nota cómo el código es prácticamente el mismo.
¿Usted simplemente desea que el decimal a ser si no se incluye el valor no tiene parte fraccionaria?

OriginalEl autor Elad Benda | 2012-03-21

6 Comentarios

  1. 34

    Puede utilizar TypeCode para cambiar:

    switch (Type.GetTypeCode(typeof(T)))
    {
        case TypeCode.Int32:
           break;
        case TypeCode.Decimal:
           break;
    }
    ¿Qué acerca de los tipos de usuario?

    OriginalEl autor Nikola Markovinović

  2. 7

    Moderno en C#:

    public static string FormatWithCommaSeperator<T>(T value) where T : struct
    {
        switch (value)
        {
            case int i:
                return $"integer {i}";
            case double d:
                return $"double {d}";
        }
    }
    Sólo funciona en C# 7.1 o más alto
    ¿qué pasa si yo sólo tengo la T, pero no un valor de T ? dicen público T Get<T>(string nombre){ }
    Usted podría utilizar default(T). Pero no estoy seguro de si eso es más rápido, a continuación, sólo tener un diccionario con el tipo de clave. Si lo que desea es una llave de la colección que muestra distintos tipos, simplemente mantenga el valor como la base común de tipo (o el Objeto), y hacer un directo emitidos en conseguir que la lanza, o el uso as que devuelve null. perfecto comportamiento, haciendo que el tipo de verificación no guardar ningún código, y sólo complican el manejo de errores.
    La corrección de mí mismo, El valor predeterminado(T) solución no funciona para ref tipos, porque el valor predeterminado es null. Así que tendrás que comprobar el tipo de con, o probablemente sólo tiene que encontrar un mejor diseño.

    OriginalEl autor Tamir Daniely

  3. 4

    Editar: Si sólo desea controlar exactamente int y double, solo tiene dos sobrecargas:

    DoFormat(int value)
    {
    }
    
    DoFormat(double value)
    {
    }

    Si usted insiste en el uso de medicamentos genéricos:

    switch (value.GetType().Name)
    {
        case "Int32":
            break;
        case "Double":
            break;
        default:
            break;
    }

    O

    if (value is int)
    {
        int iValue = (int)(object)value;
    }
    else if (value is double)
    {
        double dValue = (double)(object)value;
    }
    else
    {
    }
    obtener el error: no se puede fundido tipo NO’ a ‘int’
    Estás en lo correcto. He actualizado el post (objeto agregado de fundición). De todos modos, me gusta la respuesta de Nikola mejor de todos modos – es mucho más legible.
    public T myMethod<T>(T value) where T : object está muy bien también, y no es necesario el elenco!!

    OriginalEl autor SimpleVar

  4. 1

    Podría en lugar de la utilización de medicamentos genéricos de uso IConvertible

        public static string FormatWithCommaSeperator(IConvertible value)
        {
                IConvertible convertable = value as IConvertible;
                if(value is int)
                {
                    int iValue = convertable.ToInt32(null);
                    //Return with format.
                }
                .....
        }
    la línea de IConvertible convertable = value as IConvertible; seens redundante para mí.

    OriginalEl autor Paulie Waulie

  5. 0

    Alternativamente, usted puede siempre hacer:

    public static string FormatWithCommaSeparator<T>(T[] items)
    {
        var itemArray = items.Select(i => i.ToString());
    
        return string.Join(", ", itemArray);
    }

    OriginalEl autor Adrian Thompson Phillips

  6. 0

    Usted puede comprobar el tipo de la variabele;

        public static string FormatWithCommaSeperator<T>(T value)
        {
            if (value is int)
            {
                //Do your int formatting here
            }
            else if (value is decimal)
            {
                //Do your decimal formatting here
            }
            return "Parameter 'value' is not an integer or decimal"; //Or throw an exception of some kind?
        }

    OriginalEl autor Brian

Dejar respuesta

Please enter your comment!
Please enter your name here