Precisione di analisi del formato numerico standard
.NET supporta ora valori di precisione maggiori durante la formattazione dei numeri come stringhe usando ToString
e TryFormat
.
Nota
La precisione massima è stata modificata nuovamente in .NET 7. Per altre informazioni, vedere Precisione massima per le stringhe di formato numerico.
Descrizione delle modifiche
Quando si formattano numeri come stringhe, l'identificatore di precisione nella stringa di formato rappresenta il numero di cifre nella stringa risultante. A seconda dell'identificatore di formato, ovvero il carattere all'inizio della stringa, la precisione può rappresentare il numero totale di cifre, il numero di cifre significative o il numero di cifre decimali.
Nelle versioni precedenti di .NET, la logica di analisi del formato numerico standard è limitata a una precisione di 99 o inferiore. Alcuni tipi numerici hanno una precisione maggiore, ma ToString(string format)
non la espone correttamente. Se si specifica una precisione maggiore di 99, ad esempio 32.ToString("C100")
, la stringa di formato viene interpretata come stringa di formato numerico personalizzato anziché come "valuta con precisione 100". Nelle stringhe di formato numerico personalizzato i caratteri vengono interpretati come valori letterali carattere. Inoltre, una stringa di formato che contiene un identificatore di formato non valido viene interpretata in modo diverso a seconda del valore di precisione. H99
genera un'eccezione FormatException per l'identificatore di formato non valido, mentre H100
viene interpretata come stringa di formato numerico personalizzato.
A partire da .NET 6, .NET supporta una precisione fino a Int32.MaxValue. Una stringa di formato costituita da un identificatore di formato con un numero qualsiasi di cifre viene interpretata come stringa di formato numerico standard con precisione. Viene generata un'eccezione FormatException per una o entrambe le condizioni seguenti:
- Il carattere dell'identificatore di formato non è un identificatore di formato standard.
- La precisione è maggiore di Int32.MaxValue.
Questa modifica è stata implementata nella logica di analisi che riguarda tutti i tipi numerici.
Nella tabella seguente vengono illustrate le modifiche di comportamento per varie stringhe di formato.
Stringa di formato | Comportamento precedente | Comportamento di .NET 6 e versioni successive |
---|---|---|
C2 |
Indica la valuta con due cifre decimali | Indica la valuta con due cifre decimali (nessuna modifica) |
C100 |
Indica una stringa di formato numerico personalizzato che stampa "C100" | Indica la valuta con 100 cifre decimali |
H99 |
Genera un'eccezione FormatException a causa di un identificatore di formato standard non valido "H" | Genera un'eccezione FormatException a causa di un identificatore di formato standard non valido "H" (nessuna modifica) |
H100 |
Indica la stringa di formato numerico personalizzato | Genera un'eccezione FormatException a causa di un identificatore di formato standard non valido "H" |
Versione introdotta
.NET 6
Motivo della modifica
Questa modifica corregge il comportamento imprevisto quando si usa una precisione maggiore per l'analisi del formato numerico.
Azione consigliata
Nella maggior parte dei casi, non è necessaria alcuna azione e la precisione corretta verrà visualizzata nelle stringhe risultanti.
Tuttavia, se si desidera ripristinare il comportamento precedente in cui l'identificatore di formato viene interpretato come valore letterale carattere quando la precisione è maggiore di 99, è possibile racchiudere tale carattere tra virgolette singole o eseguirne l'escape con una barra rovesciata. Ad esempio, nelle versioni precedenti di .NET 42.ToString("G999")
restituisce G999
. Per mantenere tale comportamento, modificare la stringa di formato impostandola su "'G'999"
o "\\G999"
. Questa soluzione funziona in NET Framework, .NET Core e .NET 5 e versioni successive.
Le stringhe di formato seguenti continueranno a essere interpretate come stringhe di formato numerico personalizzato:
- Iniziare con qualsiasi carattere che non sia un carattere alfabetico ASCII, ad esempio
$
oè
. - Iniziare con un carattere alfabetico ASCII non seguito da un numero ASCII, ad esempio
A$
. - Iniziare con un carattere alfabetico ASCII, seguito da una sequenza di numeri ASCII e quindi da qualsiasi carattere che non sia un carattere numerico ASCII, ad esempio
A12A
.
API interessate
Questa modifica è stata implementata nella logica di analisi che riguarda tutti i tipi numerici.
- System.Numerics.BigInteger.ToString(String)
- System.Numerics.BigInteger.ToString(String, IFormatProvider)
- System.Numerics.BigInteger.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int32.ToString(String)
- System.Int32.ToString(String, IFormatProvider)
- System.Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt32.ToString(String)
- System.UInt32.ToString(String, IFormatProvider)
- System.UInt32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Byte.ToString(String)
- System.Byte.ToString(String, IFormatProvider)
- System.Byte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.SByte.ToString(String)
- System.SByte.ToString(String, IFormatProvider)
- System.SByte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int16.ToString(String)
- System.Int16.ToString(String, IFormatProvider)
- System.Int16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt16.ToString(String)
- System.UInt16.ToString(String, IFormatProvider)
- System.UInt16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int64.ToString(String)
- System.Int64.ToString(String, IFormatProvider)
- System.Int64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt64.ToString(String)
- System.UInt64.ToString(String, IFormatProvider)
- System.UInt64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Half.ToString(String)
- System.Half.ToString(String, IFormatProvider)
- System.Half.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Single.ToString(String)
- System.Single.ToString(String, IFormatProvider)
- System.Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Double.ToString(String)
- System.Double.ToString(String, IFormatProvider)
- System.Double.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Decimal.ToString(String)
- System.Decimal.ToString(String, IFormatProvider)
- System.Decimal.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)