web-dev-qa-db-fra.com

Puis-je formater des valeurs NULL dans string.Format?

Je me demandais s'il y avait une syntaxe pour formater les valeurs NULL dans string.Format, comme ce qu'Excel utilise

Par exemple, en utilisant Excel, je pourrais spécifier une valeur de format de {0:#,000.00;-#,000.00,NULL}, ce qui signifie afficher la valeur numérique au format numérique s'il est positif, au format numérique entre parenthèses s'il est négatif ou NULL si la valeur est nulle

string.Format("${0:#,000.00;(#,000.00);NULL}", someNumericValue);

Modifier

Je recherche des valeurs de formatage NULL/Nothing pour tous les types de données, pas seulement numériques.

Mon exemple est en fait incorrect parce que je pensais à tort qu'Excel a utilisé le 3e paramètre si la valeur était NULL, mais il est en fait utilisé lorsque la valeur est 0. Je le laisse là parce que c'est la chose la plus proche à laquelle je peux penser de ce que j'étais espérant faire.

J'espère éviter l'opérateur de coalescence nul parce que j'écris des enregistrements de journal, et les données ne sont généralement pas une chaîne

Il serait beaucoup plus facile d'écrire quelque chose comme

Log(string.Format("Value1 changes from {0:NULL} to {1:NULL}", 
    new object[] { oldObject.SomeValue, newObject.SomeValue }));

que d'écrire

var old = (oldObject.SomeValue == null ? "null" : oldObject.SomeValue.ToString());
var new = (newObject.SomeValue == null ? "null" : newObject.SomeValue.ToString());

Log(string.Format("Value1 changes from {0} to {1}", 
    new object[] { old, new }));
40
Rachel

Vous pouvez définir un formateur personnalisé qui renvoie "NULL" si la valeur est null et sinon la chaîne formatée par défaut, par exemple:

foreach (var value in new[] { 123456.78m, -123456.78m, 0m, (decimal?)null })
{
    string result = string.Format(
        new NullFormat(), "${0:#,000.00;(#,000.00);ZERO}", value);
    Console.WriteLine(result);
}

Sortie:

$123.456,78
$(123.456,78)
$ZERO
$NULL

Formateur personnalisé:

public class NullFormat : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type service)
    {
        if (service == typeof(ICustomFormatter))
        {
            return this;
        }
        else
        {
            return null;
        }
    }

    public string Format(string format, object arg, IFormatProvider provider)
    {
        if (arg == null)
        {
            return "NULL";
        }
        IFormattable formattable = arg as IFormattable;
        if (formattable != null)
        {
            return formattable.ToString(format, provider);
        }
        return arg.ToString();
    }
}
33
dtb

Je ne pense pas qu'il y ait quoi que ce soit dans String.Format qui vous permettra de spécifier un format particulier pour les chaînes null. Une solution de contournement consiste à utiliser opérateur de coalescence nulle , comme ceci:

const string DefaultValue = "(null)";

string s = null;
string formatted = String.Format("{0}", s ?? DefaultValue);
12
Jim Mischel

C'est ce que tu veux?

string test;

test ?? "NUL"

2
Karel

Il ressemble à String.Format pour .NET agit de la même manière qu'Excel, c'est-à-dire que vous pouvez utiliser ; séparateur pour les valeurs positives, négatives et 0, mais pas NULL: http://msdn.Microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator .

Vous n'aurez probablement qu'à gérer manuellement la valeur nulle:

if (myval == null)
    // handle
else
    return String.Format(...);
1
mellamokb

Vous pouvez utiliser une méthode d'extension:

 public static string ToDataString(this string prm)
   {
       if (prm == null)
       {
           return "NULL";
       }
       else
       {
           return "'" + prm.Replace("'", "''") + "'";
       }
   }

Ensuite, dans votre code, vous pouvez faire:

string Field1="Val";
string Field2=null;

string s = string.Format("Set Value:{0}, NullValue={1}",Field1.ToDataString(), Field2.ToDataString());
0
Black White