У Dart есть sprintf или только интерполяция? - PullRequest
14 голосов
/ 15 февраля 2012

Я хотел бы эмулировать C sprintf("%02d", x); в Dart, но не могу найти форматирование строки, только интерполяцию строки.

Ответы [ 6 ]

6 голосов
/ 14 июля 2013

Библиотека intl предоставляет несколько помощников для форматирования значений.См. Документацию API по адресу http://api.dartlang.org/docs/releases/latest/intl.html

Вот пример того, как преобразовать число в двухсимвольную строку:

import 'package:intl/intl.dart';

main() {
    var twoDigits = new NumberFormat("00", "en_US");
    print(twoDigits.format(new Duration(seconds: 8)));
}
6 голосов
/ 17 февраля 2012

Строковая интерполяция покрывает большинство ваших потребностей.Если вы хотите отформатировать числа напрямую, есть также num.toStringAsPrecision().

5 голосов
/ 15 февраля 2012

A String.format метод в настоящее время не существует, но есть ошибка / запрос функции для его добавления.

3 голосов
/ 08 октября 2014

Я использовал другой подход к этой проблеме: напрямую заполняя строку, мне не нужно использовать какие-либо библиотеки (в основном потому, что библиотека intl, похоже, больше не поддерживается):

x.toString().padLeft(2, "0");

будет эквивалентом sprintf ("% 02d", x);

2 голосов
/ 19 марта 2015

Вот моя реализация String.format для Dart.Он не идеален, но работает достаточно хорошо для меня:

static String format(String fmt,List<Object> params) {
  int matchIndex = 0;
  String replace(Match m) {
    if (matchIndex<params.length) {
      switch (m[4]) {
        case "f":
          num val = params[matchIndex++];
          String str;
          if (m[3]!=null && m[3].startsWith(".")) {
            str = val.toStringAsFixed(int.parse(m[3].substring(1)));
          } else {
            str = val.toString();
          }
          if (m[2]!=null && m[2].startsWith("0")) {
             if (val<0) {
               str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
             } else {
               str = str.padLeft(int.parse(m[2]),"0");
             }
          }
          return str;
        case "d":
        case "x":
        case "X":
          int val = params[matchIndex++];
          String str = (m[4]=="d")?val.toString():val.toRadixString(16); 
          if (m[2]!=null && m[2].startsWith("0")) {
            if (val<0) {
              str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
            } else {
              str = str.padLeft(int.parse(m[2]),"0");
            }
          }
          return (m[4]=="X")?str.toUpperCase():str.toLowerCase();
        case "s":
          return params[matchIndex++].toString(); 
      }
    } else {
      throw new Exception("Missing parameter for string format");
    }
    throw new Exception("Invalid format string: "+m[0].toString());
  }

Результаты теста следующие:

  format("%d", [1]) // 1
  format("%02d", [2]) // 02
  format("%.2f", [3.5]) // 3.50
  format("%08.2f", [4]) // 00004.00
  format("%s %s", ["A","B"]) // A B
  format("%x", [63]) // 3f
  format("%04x", [63]) // 003f
  format("%X", [63]) //3F
0 голосов
/ 26 июня 2019

Да, у Дарт есть пакет sprintf: https://pub.dev/packages/sprintf. Он смоделирован после спринта С.

...