예제 #1
0
        /// <summary>
        /// Method to check an input tokens min and max based on the min and max field attributes
        /// </summary>
        /// <param name="fieldName">The name of the field</param>
        /// <param name="token"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        private static void CheckTokenMinMax(Field f, String token)
        {
            Decimal result, min, max;

            if ((!String.IsNullOrEmpty(f.decimalMinimum)) &&
                (!String.IsNullOrEmpty(f.decimalMaximum)) &&
                (!String.IsNullOrEmpty(token)) &&
#if PocketPC
                (ParseAssistant.TryParse(token, out result)) &
                (ParseAssistant.TryParse(f.decimalMinimum, out min)) &
                (ParseAssistant.TryParse(f.decimalMaximum, out max)))
#else
                (Decimal.TryParse(token, out result)) &
                (Decimal.TryParse(f.decimalMinimum, out min)) &
                (Decimal.TryParse(f.decimalMaximum, out max)))
#endif
            {
                if (result < min)
                {
                    throw new TDTTranslationException("TDTFieldBelowMinimum Field:" + f.name + " Value:" + token + " Min:" + min.ToString());
                }
                if (result > max)
                {
                    throw new TDTTranslationException("TDTFieldAboveMaximum Field:" + f.name + " Value:" + token + " Max:" + max.ToString());
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Method for processing extract & format rules
        /// </summary>
        private void ProcessRules(Tuple <Scheme, Level, Option> option, ModeList ruleType, Dictionary <String, String> tokens)
        {
            if (option.Item2.rule != null)
            {
                foreach (Rule r in option.Item2.rule)
                {
                    if (r.type == ruleType)
                    {
                        // parse the command name & it's parameters
                        Regex rx = new Regex(@"^(.+?)\((.+?)\)$");
                        Match m  = rx.Match(r.function);
                        if ((m.Success) &
                            (m.Groups.Count == 3)) //TODO fix regex to have 2 groups & not a match on the whole expression
                        {
                            //TODO Switch to a parser & AST
                            String   functionName       = m.Groups[1].Value.ToLower().Trim();
                            String[] functionParameters = m.Groups[2].Value.Split(',');
                            //String field1Name = option.Item3.field.Single(f => f.name == functionParameters[0]).name;
                            Match mx = new Regex(("^[0-9]*$")).Match(functionParameters[0]);

                            String field1Value;
                            if (mx.Success)
                            {
                                field1Value = functionParameters[0];
                            }
                            else
                            {
                                field1Value = tokens[functionParameters[0]];
                            }
                            switch (functionName)
                            {
                            case "tablelookup":
                            {
                                // EX: TABLELOOKUP(gs1companyprefixindex,tdt64bitcpi,gs1companyprefixindex,gs1companyprefix)
                                if (functionParameters[1].Trim().ToLower() == "tdt64bitcpi")
                                {
                                    tokens.Add(r.newFieldName, _gs1cpi[field1Value]);
                                }
                                else
                                {
                                    throw new TDTTranslationException("TDTFileNotFound " + functionParameters[1] + " auxillary file not found");
                                }
                                break;
                            }

                            case "length":
                            {
                                tokens.Add(r.newFieldName, field1Value.Length.ToString());
                                break;
                            }

                            case "gs1checksum":
                            {
                                int checksum;
                                int weight;
                                int total = 0;
                                int len   = field1Value.Length;
                                int d;
                                for (int i = 0; i < len; i++)
                                {
                                    if (i % 2 == 0)
                                    {
                                        weight = -3;
                                    }
                                    else
                                    {
                                        weight = -1;
                                    }
                                    d      = int.Parse(field1Value.Substring(len - 1 - i, 1));    // kasuga fixed
                                    total += weight * d;
                                }
                                checksum = (10 + total % 10) % 10;
                                tokens.Add(r.newFieldName, checksum.ToString());
                                break;
                            }

                            case "substr":
                            {
                                int offset;
#if PocketPC
                                if (!ParseAssistant.TryParse(functionParameters[1], out offset))
#else
                                if (!int.TryParse(functionParameters[1], out offset))
#endif
                                {
                                    offset = int.Parse(tokens[functionParameters[1]]);
                                }
                                if (functionParameters.Length == 2)
                                {
                                    tokens.Add(r.newFieldName, field1Value.Substring(offset));
                                }
                                else if (functionParameters.Length == 3)
                                {
                                    int length;
#if PocketPC
                                    if (!ParseAssistant.TryParse(functionParameters[2], out length))
#else
                                    if (!int.TryParse(functionParameters[2], out length))
#endif
                                    {
                                        length = int.Parse(tokens[functionParameters[2]]);
                                    }
                                    tokens.Add(r.newFieldName, field1Value.Substring(offset, length));
                                }
                                break;
                            }

                            case "concat":
                            {
                                StringBuilder buffer = new StringBuilder();
                                for (int p1 = 0; p1 < functionParameters.Length; p1++)
                                {
                                    Match m2 = new Regex(("^\"(.*?)\"$|^'(.*?)'$|^[0-9]*$")).Match(functionParameters[p1]);
                                    if (m2.Success)
                                    {
                                        buffer.Append(functionParameters[p1]);
                                    }
                                    else
                                    {
                                        if (tokens.ContainsKey(functionParameters[p1]))
                                        {
                                            buffer.Append(tokens[functionParameters[p1]]);
                                        }
                                    }
                                }
                                tokens.Add(r.newFieldName, buffer.ToString());
                                break;
                            }

                            case "add":
                            {
                                int value1 = int.Parse(field1Value);
                                int value2 = int.Parse(functionParameters[1]);
                                tokens.Add(r.newFieldName, (value1 + value2).ToString());
                                break;
                            }

                            case "multiply":
                            {
                                int value1 = int.Parse(field1Value);
                                int value2 = int.Parse(functionParameters[1]);
                                tokens.Add(r.newFieldName, (value1 * value2).ToString());
                                break;
                            }

                            case "divide":
                            {
                                int value1 = int.Parse(field1Value);
                                int value2 = int.Parse(functionParameters[1]);
                                tokens.Add(r.newFieldName, (value1 / value2).ToString());
                                break;
                            }

                            case "subtract":
                            {
                                int value1 = int.Parse(field1Value);
                                int value2 = int.Parse(functionParameters[1]);
                                tokens.Add(r.newFieldName, (value1 - value2).ToString());
                                break;
                            }

                            case "mod":
                            {
                                int value1 = int.Parse(field1Value);
                                int value2 = int.Parse(functionParameters[1]);
                                tokens.Add(r.newFieldName, (value1 % value2).ToString());
                                break;
                            }
                            }
                        }
                    }
                }
            }
        }