cdm/src/main/java/ucar/nc2/ncml/NcMLWriter.java
public Element makeValuesElement(Variable variable, boolean allowRegular) throws IOException {
    Element elem = new Element("values", namespace);

    StringBuilder buff = new StringBuilder();
    Array a = variable.read();

    if (variable.getDataType() == DataType.CHAR) {
      char[] data = (char[]) a.getStorage();
      elem.setText(new String(data));
    } else if (variable.getDataType() == DataType.STRING) {
      elem.setAttribute("separator", "|");
      int count = 0;

      for (IndexIterator iter = a.getIndexIterator(); iter.hasNext(); ) {
        if (count++ > 0) {
          buff.append("|");
        }
        buff.append(iter.getObjectNext());
      }

      elem.setText(buff.toString());
    } else {
      //check to see if regular
      if (allowRegular && (a.getRank() == 1) && (a.getSize() > 2)) {
        Index ima = a.getIndex();
        double start = a.getDouble(ima.set(0));
        double incr = a.getDouble(ima.set(1)) - start;
        boolean isRegular = true;
        for (int i = 2; i < a.getSize(); i++) {
          double v1 = a.getDouble(ima.set(i));
          double v0 = a.getDouble(ima.set(i - 1));
          if (!ucar.nc2.util.Misc.nearlyEquals(v1 - v0, incr))
            isRegular = false;
        }

        if (isRegular) {
          elem.setAttribute("start", Double.toString(start));
          elem.setAttribute("increment", Double.toString(incr));
          elem.setAttribute("npts", Long.toString(variable.getSize()));
          return elem;
        }
      }

      // not regular
      boolean isRealType = (variable.getDataType() == DataType.DOUBLE) || (variable.getDataType() == DataType.FLOAT);
      IndexIterator iter = a.getIndexIterator();
      buff.append(isRealType ? iter.getDoubleNext() : iter.getIntNext());
      while (iter.hasNext()) {
        buff.append(" ");
        buff.append(isRealType ? iter.getDoubleNext() : iter.getIntNext());
      }
      elem.setText(buff.toString());

    } // not string

    return elem;
  }
public Element makeValuesElement(Variable variable, boolean allowRegular) throws IOException {
    Element elem = new Element("values", namespace);

    StringBuilder buff = new StringBuilder();
    Array a = variable.read();

    if (variable.getDataType() == DataType.CHAR) {
      char[] data = (char[]) a.getStorage();
      elem.setText(new String(data));
    } else if (variable.getDataType() == DataType.STRING) {
      elem.setAttribute("separator", "|");
      int count = 0;

      for (IndexIterator iter = a.getIndexIterator(); iter.hasNext(); ) {
        if (count++ > 0) {
          buff.append("|");
        }
        buff.append(iter.getObjectNext());
      }

      elem.setText(buff.toString());
    } else {
      //check to see if regular
      if (allowRegular && (a.getRank() == 1) && (a.getSize() > 2)) {
        Index ima = a.getIndex();
        double start = a.getDouble(ima.set(0));
        double incr = a.getDouble(ima.set(1)) - start;
        boolean isRegular = true;
        for (int i = 2; i < a.getSize(); i++) {
          double v1 = a.getDouble(ima.set(i));
          double v0 = a.getDouble(ima.set(i - 1));
          if (!ucar.nc2.util.Misc.nearlyEquals(v1 - v0, incr))
            isRegular = false;
        }

        if (isRegular) {
          elem.setAttribute("start", Double.toString(start));
          elem.setAttribute("increment", Double.toString(incr));
          elem.setAttribute("npts", Long.toString(variable.getSize()));
          return elem;
        }
      }

      // not regular
      boolean isRealType = (variable.getDataType() == DataType.DOUBLE) || (variable.getDataType() == DataType.FLOAT);
      IndexIterator iter = a.getIndexIterator();
      buff.append(isRealType ? iter.getDoubleNext() : iter.getIntNext());
      while (iter.hasNext()) {
        buff.append(" ");
        buff.append(isRealType ? iter.getDoubleNext() : iter.getIntNext());
      }
      elem.setText(buff.toString());

    } // not string

    return elem;
  }
public Element makeValuesElement ( Variable variable , boolean allowRegular ) throws IOException { Element elem = new Element ( "values" , namespace ) ; StringBuilder buff = new StringBuilder ( ) ; Array a = variable . read ( ) ; if ( variable . getDataType ( ) == DataType . CHAR ) { char [ ] data = ( char [ ] ) a . getStorage ( ) ; elem . setText ( new String ( data ) ) ; } else if ( variable . getDataType ( ) == DataType . STRING ) { elem . setAttribute ( "separator" , "|" ) ; int count = 0 ; for ( IndexIterator iter = a . getIndexIterator ( ) ; iter . hasNext ( ) ; ) { if ( count ++ > 0 ) { buff . append ( "|" ) ; } buff . append ( iter . getObjectNext ( ) ) ; } elem . setText ( buff . toString ( ) ) ; } else { //check to see if regular
 if ( allowRegular && ( a . getRank ( ) == 1 ) && ( a . getSize ( ) > 2 ) ) { Index ima = a . getIndex ( ) ; double start = a . getDouble ( ima . set ( 0 ) ) ; double incr = a . getDouble ( ima . set ( 1 ) ) - start ; boolean isRegular = true ; for ( int i = 2 ; i < a . getSize ( ) ; i ++ ) { double v1 = a . getDouble ( ima . set ( i ) ) ; double v0 = a . getDouble ( ima . set ( i - 1 ) ) ; if ( ! ucar . nc2 . util . Misc . nearlyEquals ( v1 - v0 , incr ) ) isRegular = false ; } if ( isRegular ) { elem . setAttribute ( "start" , Double . toString ( start ) ) ; elem . setAttribute ( "increment" , Double . toString ( incr ) ) ; elem . setAttribute ( "npts" , Long . toString ( variable . getSize ( ) ) ) ; return elem ; } } // not regular
 boolean isRealType = ( variable . getDataType ( ) == DataType . DOUBLE ) || ( variable . getDataType ( ) == DataType . FLOAT ) ; IndexIterator iter = a . getIndexIterator ( ) ; buff . append ( isRealType ? iter . getDoubleNext ( ) : iter . getIntNext ( ) ) ; while ( iter . hasNext ( ) ) { buff . append ( " " ) ; buff . append ( isRealType ? iter . getDoubleNext ( ) : iter . getIntNext ( ) ) ; } elem . setText ( buff . toString ( ) ) ; } // not string
 return elem ; }
Creates a {@code <values>} element from the variable's data.

@param variable  the variable to read values from
@param allowRegular  {@code true} if regular values should be represented with {@code start}, {@code increment},
and {@code npts} attributes instead of space-separated Element text. Has no effect if the data isn't regular.
@return  the {@code <values>} element.
@throws IOException  if there was an I/O error when reading the variable's data.
Creates a { @code <values > } element from the variable s data .