/**
* 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());
}