// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library number_symbols;

/**
 * This holds onto information about how a particular locale formats numbers. It
 * contains strings for things like the decimal separator, digit to use for "0"
 * and infinity. We expect the data for instances to be generated out of ICU
 * or a similar reference source.
 */

class NumberSymbols {
  final String NAME;
  final String DECIMAL_SEP, GROUP_SEP, PERCENT, ZERO_DIGIT, PLUS_SIGN,
      MINUS_SIGN, EXP_SYMBOL, PERMILL, INFINITY, NAN, DECIMAL_PATTERN,
      SCIENTIFIC_PATTERN, PERCENT_PATTERN, CURRENCY_PATTERN, DEF_CURRENCY_CODE;

  const NumberSymbols({this.NAME,
                       this.DECIMAL_SEP,
                       this.GROUP_SEP,
                       this.PERCENT,
                       this.ZERO_DIGIT,
                       this.PLUS_SIGN,
                       this.MINUS_SIGN,
                       this.EXP_SYMBOL,
                       this.PERMILL,
                       this.INFINITY,
                       this.NAN,
                       this.DECIMAL_PATTERN,
                       this.SCIENTIFIC_PATTERN,
                       this.PERCENT_PATTERN,
                       this.CURRENCY_PATTERN,
                       this.DEF_CURRENCY_CODE});

  toString() => NAME;
}