2010-01-21 4 views
0

J'ai trouvé sur SO certains postes, en ce qui concerne les chaînes de mise en forme, ce qui représente des nombres, avoir séparateurs de chiffres, lors de décimales de conversion (ou d'autres types de données du numéro) à la chaîne:Comment en C# pour reformater une chaîne, représentant une décimale, avoir un séparateur de groupe d'espace?

how to format 1700 to 1'700 and 1000000 to 1'000'000 in c#?

C#: Formatting Price value string

Que se passe-t-il si j'ai déjà ces nombres en format chaîne (que j'ai lus à partir d'un fichier .txt de StreamReader), mais que je veux quand même avoir des séparateurs de groupe (et au format chaîne de caractères)?

L'analyse en décimal, puis retour à la chaîne avec formatage nécessaire le moyen le plus raisonnable dans ce cas?

Répondre

1

est l'analyse en décimal, puis de nouveau à chaîne avec la mise en forme nécessaire façon la plus raisonnable

Oui. Ce sera moins compliqué que de le faire avec des opérations de cordes.

1

Juste par curiosité je mets cette méthode ensemble pour voir ce qu'il faudrait pour ajouter les séparateurs à la chaîne sans mise en forme et l'analyse syntaxique:

public static string AddGroupSeparators(string number) { 
    int[] sizes = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes; 
    int pos = number.LastIndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 
    if (pos == -1) pos = number.Length; 
    int sizeIndex = 0; 
    while (sizes[sizeIndex] > 0 && pos > sizes[sizeIndex]) { 
    pos -= sizes[sizeIndex]; 
    number = number.Insert(pos, CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator); 
    if (sizeIndex < sizes.Length - 1) sizeIndex++; 
    } 
    return number; 
} 
+0

Merci pour un bon exemple de manipulation de chaînes. (et rendre les choses encore plus évidentes) +1 – rem

1

Je pense aux autres. J'ai un autre moyen de mettre en forme la valeur de chaîne.
Vous pouvez vérifier sur elle:


''' <summary> 
''' Parses and formats a string value 
''' </summary> 
''' <param name="value">The value to check and format</param> 
''' <param name="f_bAddGroupSep">Specifies the formater whether adds more group separator to formatted value string</param> 
''' <returns></returns> 
''' <remarks></remarks> 
Private Function ParseValue(ByVal value As String, _ 
          Optional ByVal f_bAddGroupSep As Boolean = True) As String 
    'If invalid number 
    Dim f_decValue As Decimal = 0 
    If (String.IsNullOrEmpty(value, StringAction.Trim) _ 
    OrElse (Not (Decimal.TryParse(Trim(value), NumberStyles.Number, Me.Culture, f_decValue)))) Then Return "0" 
    'Trims value 
    value = Trim(value) 
    'If not negative, remove the negative signal 
    If (Not (Me.IsNegative)) Then value = Replace(value, Me.NumberFormat.NegativeSign, vbNullString) 
    'Starts formating value 
    Dim f_iDecNum As Int32 = 0 
    Dim f_decRndValue As Decimal = 0 
    Dim f_sNumPat As String = vbNullString 
    If (Me.IsDecimal) Then 
     'Parses the decimal digits number 
     f_iDecNum = Me.NumberFormat.NumberDecimalDigits 
     If (Me.DecimalDigits >= 0) Then f_iDecNum = Me.DecimalDigits 
     'If the formatted value had the decimal separator signal 
     If (IndexOf(value, Me.NumberFormat.NumberDecimalSeparator) >= 0) Then 
      value &= New String("0"c, f_iDecNum) 

      'Else (If the formatted value did not have the decimal separator signal) 
     Else 
      value &= String.Concat(Me.NumberFormat.NumberDecimalSeparator, New String("0"c, f_iDecNum)) 
     End If 
     'Prepares the number format pattern 
     f_sNumPat = String.Concat("N", Convert.ToString(f_iDecNum)) 

     'Else 
    Else 
     'Prepares the number format pattern 
     f_sNumPat = "N" 
    End If 
    Try 
     'Casts the string value to decimal 
     f_decValue = Convert.ToDecimal(value, Me.Culture) 
     'Prepares the rounded decimal value 
     f_decRndValue = f_decValue 
     Select Case Me.Round 
      'Rounds down 
      Case Util.NumberFormat.RoundDown 
       f_decRndValue = Decimal.Round(f_decValue, f_iDecNum) 
       If (f_decRndValue <> f_decValue) Then f_decRndValue = Decimal.Round((f_decValue - Convert.ToDecimal(String.Concat("0", Me.NumberFormat.NumberDecimalSeparator, New String("0"c, f_iDecNum), "5"), Me.NumberFormat)), f_iDecNum) 
       'Rounds up 
      Case Util.NumberFormat.RoundUp 
       f_decRndValue = Decimal.Round(f_decValue, f_iDecNum) 
       If (f_decRndValue <> f_decValue) Then f_decRndValue = Decimal.Round((f_decValue + Convert.ToDecimal(String.Concat("0", Me.NumberFormat.NumberDecimalSeparator, New String("0"c, f_iDecNum), "5"), Me.NumberFormat)), f_iDecNum) 
       'Rounds by the decimal digits number 
      Case Util.NumberFormat.HalfAdjust 
       f_decRndValue = Decimal.Round(f_decValue, f_iDecNum) 
       'Rounds up 
       If (f_decRndValue > f_decValue) Then 
        f_decRndValue = Decimal.Round((f_decValue + Convert.ToDecimal(String.Concat("0", Me.NumberFormat.NumberDecimalSeparator, New String("0"c, f_iDecNum), "5"), Me.NumberFormat)), f_iDecNum) 

        'Else (Rounds down) 
       ElseIf (f_decRndValue < f_decValue) Then 
        f_decRndValue = Decimal.Round((f_decValue - Convert.ToDecimal(String.Concat("0", Me.NumberFormat.NumberDecimalSeparator, New String("0"c, f_iDecNum), "5"), Me.NumberFormat)), f_iDecNum) 
       End If 
     End Select 
     'Returns the formatted decimal value 
     value = f_decRndValue.ToString(f_sNumPat, Me.Culture) 
    Catch ex As Exception 
     f_decValue = 0 
     f_decRndValue = 0 
     value = "0" 
    End Try 
    Return value 
End Function 
  • Utiliser les propriétés:
    -----------------
  • Me.IsDecimal: Indique si formats valeur de chaîne comme nombre décimal
  • Me.IsNegative: Indique si accepte la valeur décimale négative
  • Me.Culture: Votre informations de culture
  • Me.NumberFormat: informations de format numérique. Il est obtenu de Me.Culture (= Me.Culture.NumberFormat)
  • Me.Round: La façon d'arrondir un nombre décimal (arrondit, arrondi à l'inférieur, ou demi ajuster (tours par chiffres décimaux))
  • Me.DecimalDigits: Le nombre de chiffres décimaux
Questions connexes