/** * Parse an dimension string and intern it: * dim := <ratio> ["*" <ratio>]* * ratio := <base> <exp> * base := "kg" | "m" | "sec" | "K" | "A" | "mol" | "cd" */ private static Dimension parseDim(string s) { // handle empty string as dimensionless if (s.Length == 0) { return(m_dimensionless); } // parse dimension Dimension dim = new Dimension(); List ratios = FanStr.split(s, Long.valueOf((long)'*'), true); for (int i = 0; i < ratios.sz(); ++i) { string r = (string)ratios.get(i); if (r.StartsWith("kg")) { dim.kg = SByte.Parse(r.Substring(2).Trim()); continue; } if (r.StartsWith("sec")) { dim.sec = SByte.Parse(r.Substring(3).Trim()); continue; } if (r.StartsWith("mol")) { dim.mol = SByte.Parse(r.Substring(3).Trim()); continue; } if (r.StartsWith("m")) { dim.m = SByte.Parse(r.Substring(1).Trim()); continue; } if (r.StartsWith("K")) { dim.K = SByte.Parse(r.Substring(1).Trim()); continue; } if (r.StartsWith("A")) { dim.A = SByte.Parse(r.Substring(1).Trim()); continue; } if (r.StartsWith("cd")) { dim.cd = SByte.Parse(r.Substring(2).Trim()); continue; } throw new Exception("Bad ratio '" + r + "'"); } // intern return(dim.intern()); }
/** * Parse an un-interned unit: * unit := <name> [";" <symbol> [";" <dim> [";" <scale> [";" <offset>]]]] */ private static Unit parseUnit(string s) { string idStrs = s; int c = s.IndexOf(';'); if (c > 0) { idStrs = s.Substring(0, c); } List ids = FanStr.split(idStrs, Long.valueOf(',')); if (c < 0) { return(new Unit(ids, m_dimensionless, 1, 0)); } string dim = s = s.Substring(c + 1).Trim(); c = s.IndexOf(';'); if (c < 0) { return(new Unit(ids, parseDim(dim), 1, 0)); } dim = s.Substring(0, c).Trim(); string scale = s = s.Substring(c + 1).Trim(); c = s.IndexOf(';'); if (c < 0) { return(new Unit(ids, parseDim(dim), Double.parseDouble(scale), 0)); } scale = s.Substring(0, c).Trim(); string offset = s.Substring(c + 1).Trim(); return(new Unit(ids, parseDim(dim), Double.parseDouble(scale), Double.parseDouble(offset))); }