Formatage des chaînes. Fonctions de formatage intégrées. Paramètres régionaux de CultureInfo

Ceux qui écrivent en C# connaissent très bien et utilisent souvent le mécanisme String.Format, qui fait cruellement défaut à JavaScript. Malgré sa simplicité et sa commodité, il y a peu de choses qui peuvent être trouvées sur Internet, principalement des variations sur le thème sprintf (bonjour à l'industrie technologique). Il y a assez longtemps, un script a été écrit qui permettait de formater des chaînes en JavaScript et était similaire à String.Format C#. Le formatage a commencé à être largement utilisé par mes collègues dans les scripts, et j'ai décidé de ranger un peu le code et de le publier pour ceux qui souhaitent obtenir String.Format en JavaScript.

Chaque champ de champ comporte un caractère. Veuillez toutefois noter que dernier morceau est facultatif et contient le caractère \\0, appelé caractère nul. Cela devrait mettre fin à toutes les lignes de texte. Bien qu'il ne prenne pas en charge le cache comme un langage de chaînes de texte, il contient bibliothèques standards qui travaillent avec eux. Nous devons donc stocker les chaînes telles qu’elles devraient ressembler. Ainsi, le champ de chaîne doit toujours être supérieur de 1 à la longueur du texte que vous y entrez !

Bien que cela dépasse le cadre de ce didacticiel, supposons qu'un caractère nul se trouve à la fin d'une chaîne pour savoir où se termine la chaîne. En plus des champs statiques, nous pouvons stocker des chaînes à l'aide de pointeurs comme des sections de mémoire arbitrairement longues, là où nous ne pouvons pas nous passer de cette béquille. Nous vous montrerons ce chemin dans une série. La deuxième façon de marquer la fin d’une chaîne consiste à conserver sa longueur jusqu’au premier caractère.

Donc, les principales caractéristiques :

  • Marqueurs comme en C# : (0)
  • Vous pouvez spécifier la fonction de formatage utilisée : (0:d)
  • Vous pouvez passer des paramètres à la fonction de formatage : (0:n(,2))
  • Vous pouvez enregistrer vos propres fonctions de formatage
  • Petite taille - 3,5 Ko emballés
  • Fonctionne vite
  • Fonctionne sous IE, Chrome, Firefox (testé), théoriquement rien ne l'empêche de fonctionner en JavaScript côté serveur
  • Des fonctions de formatage ont déjà été implémentées et intégrées :
    • Formatage des tableaux
    • Formatage des nombres
    • Formatage de la date et de l'heure

Usage

Peut être utilisé de 2 manières :
1. Comme en C# :
var s = String.Format(format, arg0 [ , arg1 [ , arg2 [ ...] ] ] );

2. En fonction de n'importe quelle chaîne :
var s = "chaîne de format (0)" .format (arg0 [ , arg1 [ , arg2 [ ...] ] ] );
Règles pour les marqueurs
(0) - la valeur sera convertie en chaîne selon les règles JavaScript
(0:f) - la valeur sera convertie en chaîne à l'aide de la fonction enregistrée sous le nom f
(0:f(p1,p2)) - la valeur sera convertie en chaîne à l'aide d'une fonction enregistrée sous le nom f et cette fonction recevra les paramètres p1 et p2 dans un tableau, le nombre et les règles des paramètres dépendent sur la fonction elle-même, il existe cependant plusieurs règles communes :
  1. Les paramètres sont séparés par des virgules
  2. Tous les signes entre parenthèses sont significatifs, c'est-à-dire for (0:f(p1,p2)) ["p1", "p2"] sera transmis, et dans le cas de (0:f(p1, p2)) ["p1", "p2"] sera transmis
  3. Pour échapper à la virgule et à la parenthèse fermante, utilisez une barre oblique : (0:f(p1\, p2)) sera transmis ["p1, p2"]
  4. Les paramètres peuvent être ignorés : for (0:f(,p2)) ["", "p2"] sera transmis
  5. Vous pouvez utiliser des marqueurs imbriqués : for (0:f((1))), ["value_from_parameter_with_index_1"] sera passé, dans ce cas le formatage n'est pas autorisé, et la valeur passée est la même que celle passée à la fonction format
Fonctionnalités de formatage
Toutes les fonctions de formatage reçoivent 2 paramètres : la valeur à formater et un tableau de paramètres. Voici comment il est recommandé d'enregistrer les fonctions de formatage :
(fonction(format)
{
// Enregistre une fonction de formatage
// nom - nom à utiliser dans les marqueurs
// v - la valeur à formater sera transmise à la fonction de la même manière qu'elle a été transmise à fonction de formatage
// params - un tableau de paramètres, toujours présent, mais peut être de taille nulle
// La fonction doit retourner une chaîne qui remplacera le label
format.add(nom, fonction(v, paramètres)
{
retour ...;
} );
} )(String.prototype.format);
Fonctionnalités de formatage intégrées
Le script dispose déjà de fonctions de formatage intégrées pour les nombres, les tableaux et les dates.

(0:n) - formatage d'un nombre ; si la fonction reçue n'est pas un nombre, alors NaN sera affiché. Le type de nombres 1.11111111e+20 sera converti en normal : 111111111000000000000. Vous pouvez transmettre des chaînes avec le nombre : "1.67" ou "123.456e+2" - 1.67 et 12345.6 seront insérés, respectivement.

Par exemple, ce système était utilisé en Pascal, mais il est beaucoup plus couramment utilisé pour représenter le caractère nul. Créons un exemple simple. Nous mettons le texte dans une variable puis l'écrivons sur la console. Le code ci-dessus peut être réécrit sous cette forme. Notez que le champ doit avoir une longueur de 5, même si l'arc-en-ciel comporte 4 lettres. Si c'est plus long, ce n'est pas grave. Même sur un gâteau, nous pouvons laisser déterminer la longueur du texte.

Ce qui ne fonctionne malheureusement pas, c'est d'attribuer une constante de chaîne à un champ existant. En effet, le champ ne peut pas être attribué. Cependant, rien ne nous empêche d'attribuer des caractères individuels à l'aide d'une boucle ou d'utiliser des chaînes pour la copie. à l'avenir.

(0:n([i][,f])) - formatage d'un nombre avec un remplissage nul au nombre de chiffres requis.
i est le nombre de chiffres pour toute la partie ; s'il y a plus de chiffres dans toute la partie, alors ils restent en place s'il y en a moins, le nombre de zéros requis sera inséré au début ;
f est le nombre de chiffres pour la partie fractionnaire ; les nombres supplémentaires seront ignorés.
Les paramètres peuvent être ignorés : (0:n(,2)) - affiche un nombre avec 2 décimales.

Nous pouvons traiter une chaîne exactement de la même manière qu'un champ car ce n'est pas un problème d'écrire un caractère, de le modifier ou de raccourcir la chaîne. En remplaçant le quatrième caractère par \\0, nous terminons la ligne précédant ce caractère. Pour le caractère nul, attention à l'édition des caractères de chaîne, lorsque vous l'oubliez, le programme ne sait pas où finit la ligne et vous vous retrouvez dans une mémoire qui ne vous appartient pas.

Utilisez une variable de chaîne pour créer une chaîne de charme et définir taille maximale, par exemple, 50 caractères. Si nous ne l'avons pas installé et placé sur un utilisateur exotique ou simplement sur un pilleur, il y aura un débordement de champ et un crash du programme.

(0:df([f])) - formatage de date personnalisé, f - chaîne de formatage avec substitutions, substitutions possibles :

  • aa ou aaaa - Année, affiche toujours 4 caractères.
  • M ou MM - Mois, 1 ou 2 chiffres
  • d ou dd - Jour, 1 ou 2 chiffres
  • H ou HH - Heures, 1 ou 2 chiffres au format 24 heures
  • m ou mm - Minutes, 1 ou 2 chiffres
  • s ou ss - Secondes, 1 ou 2 chiffres
  • f...ffff - Millisecondes, de 1 à 4 caractères

Cet exemple formate double en chaîne avec nombre fixe de décimales. Pour deux décimales, utilisez le modèle „ 0.00 « . Si un nombre flottant comporte moins de décimales, les autres chiffres à droite seront des zéros. S'il comporte plus de décimales, le nombre sera arrondi.

Fonctions standard pour travailler avec des chaînes

Modifiez la ligne de téléchargement sur ce formulaire. Il s'agit de la longueur de la partie visible sans le \\0. Assurez-vous qu'il y a suffisamment d'espace dans la première ligne. Puisqu'un champ ne peut pas être copié dans son ensemble, nous disposons de cette fonction qui clone la chaîne de texte d'une autre variable.

Nous pouvons obtenir du caractère dans le texte. Le drapeau vérifie la carte de zéro à la fin et renvoie un soi-disant pointeur si le personnage en trouve un. Même si nous ne le savons pas encore, il suffit de soustraire la chaîne de cette valeur et nous obtiendrons la position où se trouve le caractère.


// juste deux décimales String .Format("(0:0.00)" , 123.4567); // "123,46" Chaîne .Format("(0:0.00)" , 123,4); // "123.40" Chaîne .Format("(0:0.00)" , 123.0); // "123.00"

L'exemple suivant formate le double en chaîne avec nombre flottant de décimales. Par ex. pour un maximum de deux décimales, utilisez le modèle " 0.## “.


//maximum. deux décimales String .Format("(0:0.##)" , 123.4567); // "123.46" Chaîne .Format("(0:0.##)" , 123.4); // "123,4" Chaîne .Format("(0:0.##)" , 123,0); // "123"

Chiffres avant le point décimal

Si vous souhaitez qu'un nombre flottant ait nombre minimal de chiffres avant la virgule décimale utilisez N fois zéro avant le point décimal. Par ex. modèle " 00.0 " formate un nombre flottant en chaîne avec au moins deux chiffres avant la virgule décimale et un chiffre après.

Il n'est probablement pas surprenant que la position soit indexée à partir de zéro. Tout comme nous pouvons rechercher un seul caractère, nous pouvons également rechercher une chaîne dans une chaîne. Nous les appelons également ce qu'on appelle des sous-chaînes. Compare 2 chaînes par ordre alphabétique et renvoie nombre négatif, si c'est le premier avant un autre, 0 s'ils sont identiques et un nombre positif si c'est le premier après l'autre.

Les fonctions de chaîne peuvent également être trouvées dans d'autres variantes. Ceci spécifie la limite de caractères qui fonctionne dans le processus de chaîne. Si la chaîne est plus longue, elle n'en renvoie qu'une partie, mise à l'échelle quantité maximale personnages. Attention, cette section ne comporte pas le caractère \\0. Lors de la programmation, nous devons souvent travailler à la fois avec des chiffres et du texte.


// au moins deux chiffres avant la virgule Chaîne .Format("(0:00.0)" , 123.4567); // "123,5" Chaîne .Format("(0:00.0)" , 23.4567); // "23,5" Chaîne .Format("(0:00.0)" , 3.4567); // "03.5" Chaîne .Format("(0:00.0)" , -3.4567); // "-03.5"

Séparateur de milliers

Pour formater un double en chaîne avec utilisation du séparateur de milliers utilisez des séparateurs zéro et virgule avant un modèle de formatage flottant habituel, par ex. modèle " 0,0.0 " formate le nombre pour utiliser des milliers de séparateurs et avoir une décimale.


Chaîne .Format("(0:0,0.0)" , 12345.67); // "12 345,7" Chaîne .Format("(0:0,0)" , 12345,67); // "12 346"

Le circuit peut être utilisé comme domaine général, mais présente quelques caractéristiques particulières. Le dernier caractère de chaque ligne est ce qu'on appelle le caractère nul, qui s'écrit "\\0". Il est donc conseillé d'ajouter 1 élément supplémentaire dans la déclaration de chaîne. Si une ligne est supprimée lors du traitement de la ligne, nous ne connaissons pas le caractère de fin. Avec une chaîne, en tant que domaine général, on ne peut pas travailler dans son ensemble, toujours sur des éléments. Cependant, comme les chaînes apparaissent fréquemment en programmation, outils standards ont été créés pour faciliter le travail avec les cordes.

Il ne sait pas lire plus de motsà la fois, séparés par un espace, et donc généralement inadaptés au chargement de chaînes. Dans la section suivante, nous spécifierons uniquement le nom de la fonction et brève description les plus utilisés. Parcourir les autres fonctions utiles pour travailler avec des caractères et des chaînes.

Zéro

Flotter nombres entre zéro et un peut être formaté de deux manières, avec ou sans zéro avant la virgule décimale. Pour formater un nombre sans zéro non significatif, utilisez # avant le point. Par exemple " #.0 « formate le nombre pour qu'il ait une décimale et de zéro à N chiffres avant la virgule décimale (par exemple « .5 » ou « 123,5 »).

Le code suivant montre comment peut-on formater un zéro(de type double).


Chaîne .Format("(0:0.0)" , 0.0); // "0.0" Chaîne .Format("(0:0.#)" , 0.0); // "0" Chaîne .Format("(0:#.0)" , 0.0); // ".0" Chaîne .Format("(0:#.#)" , 0.0); // ""

Le programme extrait la chaîne, enregistre sa longueur et la compare avec ligne suivante. Dans ce travail, nous expliquons ce qu'est une variable, comment elle est traitée et comment lister son contenu. Les variables constituent la base de tout langage de programmation et représentent un emplacement nommé dans la mémoire de l'ordinateur. Nous pouvons accéder à cet emplacement en utilisant le nom de la variable. En plus du nom, chaque variable est définie par son type de données, qui détermine le type de données que nous pouvons stocker dans la variable.

Nous avons le choix types suivants données. Les types de données ci-dessus peuvent également être complétés avec une clé non signée devant le nom du type, ce qui signifie que nous ne ferons pas de différence entre cette variable et une variable positive ou négative. Cela entraînera le stockage du numéro dans une telle variable taille plus grande, car aucun bit de signe n'est utilisé et il peut donc être utilisé pour stocker le numéro.

Aligner les nombres avec les espaces

Pour aligner le nombre flottant À droite utilisez la virgule „ , " option avant les deux points. Tapez une virgule suivie d'un certain nombre d'espaces, par ex. " 0,10:0.0 " (cela ne peut être utilisé que dans la méthode String.Format, pas dans la méthode double.ToString). Pour aligner les nombres À gauche utilisez un nombre d’espaces négatif.


Chaîne .Format("(0.10:0.0)" , 123.4567); // " 123,5" Chaîne .Format("(0,-10:0.0)" , 123.4567); // "123.5 " String .Format("(0,10:0.0)" , -123.4567); // " -123.5" Chaîne .Format("(0,-10:0.0)" , -123.4567); // "-123,5"

Encore une chose très importante. La taille des types de données n'est pas garantie et la taille des différentes plates-formes peut varier. Vous ne devez donc pas compter sur une double variable pour toujours stocker un nombre de 8 octets. Pour travailler avec des variables, comme attribuer des valeurs, effectuer diverses opérations mathématiques, ce que l'on appelle des opérateurs sont utilisés. L’exemple suivant résume les informations décrites ci-dessus. Si une situation se présente où nous devons ajouter une valeur à la valeur actuelle d’une variable, nous pouvons le faire de manière séquentielle.

Formatage personnalisé pour les nombres négatifs et zéro

Si vous devez utiliser un format personnalisé pour les nombres flottants négatifs ou zéro, utilisez séparateur point-virgule; "pour diviser le motif en trois sections. La première section formate les nombres positifs, la la deuxième section formate les nombres négatifs et la troisième section formate zéro. Si vous omettez la dernière section, le zéro sera formaté en utilisant la première section.


Chaîne .Format("(0:0.00;moins 0.00;zéro)" , 123.4567); // "123.46" String .Format("(0:0.00;moins 0.00;zéro)" , -123.4567); // "moins 123,46" String .Format("(0:0.00;moins 0.00;zéro)" , 0.0); // "zéro"

Mais il est bien plus approprié d’utiliser une notation tronquée qui ressemble à ceci. C'est ainsi que nous avons brièvement parlé des variables et voyons comment lister la valeur d'une variable. Cette ligne représente le texte que nous voulons afficher à l'écran. On peut alors insérer des séquences de contrôle dans cette ligne. Voici une liste de quelques séquences de contrôle. Voici un exemple de dump.

En faisant cela, nous n'avons rien fait d'autre que de définir la valeur entière de la variable et de lui donner une valeur initiale. Si nous devons imprimer le contenu de plusieurs variables, nous ajouterons les séquences de contrôle correspondantes à la chaîne de format et les passerons en paramètres. C'est pourquoi le langage introduit la possibilité de transtypage, afin que nous puissions dire quel devrait être le résultat de l'expression. P. Parce qu’il manque de logique.

Quelques exemples amusants

Comme vous avez pu le remarquer dans l'exemple précédent, vous pouvez mettre n'importe quel texte dans un modèle de formatage, par ex. avant un schéma habituel „ mon texte 0.0 « . Vous pouvez même mettre n'importe quel texte entre les zéros, par ex. " 0aaa.bbb 0 “.


String .Format("(0:mon numéro est 0.0)" , 12.3); // "mon numéro est 12,3" String .Format("(0:0aaa.bbb0)" , 12.3); // "12aaa.bbb3"



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :