2011-10-07 15 views
37

Mi chiedevo se c'è una sintassi per formattare valori NULL in string.Format, come quello che utilizza ExcelPosso formattare i valori NULL in string.Format?

Ad esempio, utilizzando Excel ho potuto specificare un valore formato {0:#,000.00;-#,000.00,NULL}, che significa visualizzare il valore numerico come formato numerico se positiva, formato numero tra parentesi, se negativo, o NULL se il valore è nullo

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

Modifica

sto cercando la formattazione NULL/Nothing valori per tutti i tipi di dati, non solo quelli numerici.

Il mio esempio è in realtà corretto perché ho erroneamente pensato Excel utilizzato il 3 ° parametro se il valore è nullo, ma in realtà è usato quando il valore è 0. me ne vado in là, perché è la cosa più vicina che posso pensare a quello che speravo di fare.

sto sperando di evitare l'operatore null coalescenza perché sto scrivendo record di log, e il dato non è di solito una stringa

Sarebbe molto più facile scrivere qualcosa di simile

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

che a scrivo

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 })); 
+0

'null' (' Nothing' in Visual Basic) o '0' (zero)? – dtb

+0

@dtb Sto cercando la formattazione 'null' /' Nothing' – Rachel

+0

@JimMischel Spiacente, stavo pensando a valori NULL formattati in Excel con il terzo parametro. In realtà è zeri. Aggiornerò la mia domanda, ma lascio l'esempio di Excel lì perché è la cosa più vicina che riesco a pensare a ciò che sto cercando. – Rachel

risposta

30

È possibile definire una custom formatter che restituisce "NULL" se il valore è null e altrimenti la stringa predefinita formattato, per esempio:

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); 
} 

uscita:

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

personalizzato Formatter:

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(); 
    } 
} 
+0

Grazie, che funziona esattamente come speravo che avrebbe funzionato! Mi hai reso la vita molto più semplice :) – Rachel

+0

Questo non funziona per me. Sto scrivendo un JsonValueFormatter e il valore null non sta mai entrando nel metodo Format. Se faccio 'string.Format (formatter," Test: {0}, {1}, {2} ", true, 10, null," Hello ")' restituisce 'Test: true, 10,," Hello " '. –

11

non credo che ci sia qualcosa in String.Format che vi permetterà di specificare un particolare formato per null stringhe. Una soluzione è quella di utilizzare il null-coalescing operator, in questo modo:

const string DefaultValue = "(null)"; 

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

Vedere la mia domanda aggiornata. Speravo di evitare di usare '??' perché di solito i dati non sono una stringa – Rachel

+1

@Rachel: vedere la mia risposta aggiornata. Non c'è motivo per cui devi limitare l'operatore a coalescenza nulla alle stringhe. –

+9

Sì, ma voglio che il valore predefinito sia '" NULL "' anche se il tipo di dati è un numero o una data. Non posso usare 'someNumber ?? "NULL" perché la stringa '" NULL "' non ha lo stesso tipo di dati di 'someNumber' – Rachel

2

E 'questo quello che vuoi?

string test; 

test ?? "NULL"

+0

Vedere la mia domanda aggiornata. Speravo di evitare di usare '??' perché i dati non sono di solito una stringa – Rachel

0

è possibile utilizzare un metodo di estensione:

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

Poi nel codice che si può fare:

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

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

Questo non funzionerà per il caso utente OP – miniBill

Problemi correlati