
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_text_DecimalFormatSymbols__
#define __java_text_DecimalFormatSymbols__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace text
    {
        class DecimalFormatSymbols;
    }
  }
}

class java::text::DecimalFormatSymbols : public ::java::lang::Object
{

public:
  virtual ::java::lang::Object * clone();
  DecimalFormatSymbols();
private:
  ::java::lang::String * safeGetString(::java::util::ResourceBundle *, ::java::lang::String *, ::java::lang::String *);
  jchar safeGetChar(::java::util::ResourceBundle *, ::java::lang::String *, jchar);
public:
  DecimalFormatSymbols(::java::util::Locale *);
  virtual jboolean equals(::java::lang::Object *);
  virtual ::java::util::Currency * getCurrency();
  virtual ::java::lang::String * getCurrencySymbol();
  virtual jchar getDecimalSeparator();
  virtual jchar getDigit();
public: // actually package-private
  virtual jchar getExponential();
public:
  virtual jchar getGroupingSeparator();
  virtual ::java::lang::String * getInfinity();
  virtual ::java::lang::String * getInternationalCurrencySymbol();
  virtual jchar getMinusSign();
  virtual jchar getMonetaryDecimalSeparator();
  virtual ::java::lang::String * getNaN();
  virtual jchar getPatternSeparator();
  virtual jchar getPercent();
  virtual jchar getPerMill();
  virtual jchar getZeroDigit();
  virtual jint hashCode();
  virtual void setCurrency(::java::util::Currency *);
  virtual void setCurrencySymbol(::java::lang::String *);
  virtual void setDecimalSeparator(jchar);
  virtual void setDigit(jchar);
public: // actually package-private
  virtual void setExponential(jchar);
public:
  virtual void setGroupingSeparator(jchar);
  virtual void setInfinity(::java::lang::String *);
  virtual void setInternationalCurrencySymbol(::java::lang::String *);
  virtual void setMinusSign(jchar);
  virtual void setMonetaryDecimalSeparator(jchar);
  virtual void setNaN(::java::lang::String *);
  virtual void setPatternSeparator(jchar);
  virtual void setPercent(jchar);
  virtual void setPerMill(jchar);
  virtual void setZeroDigit(jchar);
private:
  void readObject(::java::io::ObjectInputStream *);
public:
  static ::java::text::DecimalFormatSymbols * getInstance();
  static ::java::text::DecimalFormatSymbols * getInstance(::java::util::Locale *);
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) currencySymbol;
  jchar decimalSeparator;
  jchar digit;
  jchar exponential;
  jchar groupingSeparator;
  ::java::lang::String * infinity;
  ::java::lang::String * intlCurrencySymbol;
  jchar minusSign;
  jchar monetarySeparator;
  ::java::lang::String * NaN;
  jchar patternSeparator;
  jchar percent;
  jchar perMill;
  jint serialVersionOnStream;
  jchar zeroDigit;
  ::java::util::Locale * locale;
  ::java::util::Currency * currency;
  static const jlong serialVersionUID = 5772796243397350300LL;
public:
  static ::java::lang::Class class$;
};

#endif // __java_text_DecimalFormatSymbols__
