public static string GetFormatterContent(Serie serie, SerieData serieData,
                                                 double dataValue, double dataTotal, LabelStyle serieLabel, Color color)
        {
            if (serieLabel == null)
            {
                serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
            }
            var numericFormatter = serieLabel == null ? "" : serieLabel.numericFormatter;
            var serieName        = serie.serieName;
            var dataName         = serieData != null ? serieData.name : null;

            if (string.IsNullOrEmpty(serieLabel.formatter))
            {
                var currentContent = ChartCached.NumberToStr(dataValue, numericFormatter);
                if (serieLabel.formatterFunction == null)
                {
                    return(currentContent);
                }
                else
                {
                    return(serieLabel.formatterFunction(serieData.index, dataValue, null, currentContent));
                }
            }
            else
            {
                var content = serieLabel.formatter;
                FormatterHelper.ReplaceSerieLabelContent(ref content, numericFormatter, serie.dataCount, dataValue,
                                                         dataTotal, serieName, dataName, dataName, color, serieData);
                if (serieLabel.formatterFunction == null)
                {
                    return(content);
                }
                else
                {
                    return(serieLabel.formatterFunction(serieData.index, dataValue, null, content));
                }
            }
        }
        public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
                                                      string marker, string itemFormatter, string numericFormatter,
                                                      ref List <SerieParams> paramList, ref string title)
        {
            if (dataIndex < 0)
            {
                dataIndex = serie.context.pointerItemDataIndex;
            }

            if (dataIndex < 0)
            {
                return;
            }

            var serieData = serie.GetSerieData(dataIndex);

            if (serieData == null)
            {
                return;
            }

            title = category;

            var color               = SerieHelper.GetItemColor(serie, serieData, chart.theme, serie.context.colorIndex, false);
            var newMarker           = SerieHelper.GetItemMarker(serie, serieData, marker);
            var newItemFormatter    = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
            var newNumericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);

            var param = serie.context.param;

            param.serieName        = serie.serieName;
            param.serieIndex       = serie.index;
            param.category         = category;
            param.dimension        = 1;
            param.serieData        = serieData;
            param.dataCount        = serie.dataCount;
            param.value            = 0;
            param.total            = 0;
            param.color            = color;
            param.marker           = newMarker;
            param.itemFormatter    = newItemFormatter;
            param.numericFormatter = newNumericFormatter;
            param.columns.Clear();

            param.columns.Add(param.marker);
            param.columns.Add(serie.serieName);
            param.columns.Add(string.Empty);

            paramList.Add(param);
            for (int i = 0; i < 4; i++)
            {
                param                  = new SerieParams();
                param.serieName        = serie.serieName;
                param.serieIndex       = serie.index;
                param.dimension        = i;
                param.serieData        = serieData;
                param.dataCount        = serie.dataCount;
                param.value            = serieData.GetData(i);
                param.total            = SerieHelper.GetMaxData(serie, i);
                param.color            = color;
                param.marker           = newMarker;
                param.itemFormatter    = newItemFormatter;
                param.numericFormatter = newNumericFormatter;
                param.columns.Clear();

                param.columns.Add(param.marker);
                param.columns.Add(XCSettings.lang.GetCandlestickDimensionName(i));
                param.columns.Add(ChartCached.NumberToStr(param.value, param.numericFormatter));

                paramList.Add(param);
            }
        }
 public static string Cancat(string str1, int i)
 {
     s_Builder.Length = 0;
     s_Builder.Append(str1).Append(ChartCached.IntToStr(i));
     return(s_Builder.ToString());
 }
        /// <summary>
        /// 替换字符串中的通配符,支持的通配符有{.}、{a}、{b}、{c}、{d}、{e}、{f}、{g}。
        /// </summary>
        /// <param name="content">要替换的字符串</param>
        /// <param name="dataIndex">选中的数据项serieData索引</param>
        /// <param name="numericFormatter">默认的数字格式化</param>
        /// <param name="serie">选中的serie</param>
        /// <param name="series">所有serie</param>
        /// <param name="theme">用来获取指定index的颜色</param>
        /// <param name="category">选中的类目,一般用在折线图和柱状图</param>
        /// <param name="dataZoom">dataZoom</param>
        /// <returns></returns>
        public static bool ReplaceContent(ref string content, int dataIndex, string numericFormatter, Serie serie,
                                          BaseChart chart, DataZoom dataZoom = null)
        {
            var foundDot = false;
            var mc       = s_Regex.Matches(content);

            foreach (var m in mc)
            {
                var old       = m.ToString();
                var args      = s_RegexSub.Matches(m.ToString());
                var argsCount = args.Count;
                if (argsCount <= 0)
                {
                    continue;
                }
                int  targetIndex = 0;
                char p           = GetSerieIndex(args[0].ToString(), ref targetIndex);
                if (targetIndex >= 0)
                {
                    serie = chart.GetSerie(targetIndex);
                    if (serie == null)
                    {
                        continue;
                    }
                }
                else if (serie != null)
                {
                    targetIndex = serie.index;
                }
                else
                {
                    serie       = chart.GetSerie(0);
                    targetIndex = 0;
                }
                if (serie == null)
                {
                    continue;
                }
                if (p == '.')
                {
                    var bIndex = targetIndex;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexN.IsMatch(args1Str))
                        {
                            bIndex = int.Parse(args1Str);
                        }
                    }
                    content  = content.Replace(old, ChartCached.ColorToDotStr(chart.theme.GetColor(bIndex)));
                    foundDot = true;
                }
                else if (p == 'a' || p == 'A')
                {
                    if (argsCount == 1)
                    {
                        content = content.Replace(old, serie.serieName);
                    }
                }
                else if (p == 'b' || p == 'B' || p == 'e' || p == 'E')
                {
                    var bIndex = dataIndex;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexN.IsMatch(args1Str))
                        {
                            bIndex = int.Parse(args1Str);
                        }
                    }
                    var needCategory = (p != 'e' && p != 'E') && (serie is Line || serie is Bar);
                    if (needCategory)
                    {
                        var category = chart.GetTooltipCategory(dataIndex, serie, dataZoom);
                        content = content.Replace(old, category);
                    }
                    else
                    {
                        var serieData = serie.GetSerieData(bIndex, dataZoom);
                        content = content.Replace(old, serieData.name);
                    }
                }
                else if (p == 'g' || p == 'G')
                {
                    content = content.Replace(old, ChartCached.NumberToStr(serie.dataCount, ""));
                }
                else if (p == 'c' || p == 'C' || p == 'd' || p == 'D' || p == 'f' || p == 'f')
                {
                    var isPercent      = p == 'd' || p == 'D';
                    var isTotal        = p == 'f' || p == 'f';
                    var bIndex         = dataIndex;
                    var dimensionIndex = -1;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexFn.IsMatch(args1Str))
                        {
                            numericFormatter = args1Str;
                        }
                        else if (s_RegexN_N.IsMatch(args1Str))
                        {
                            var temp = args1Str.Split('-');
                            bIndex         = int.Parse(temp[0]);
                            dimensionIndex = int.Parse(temp[1]);
                        }
                        else if (s_RegexN.IsMatch(args1Str))
                        {
                            dimensionIndex = int.Parse(args1Str);
                        }
                        else
                        {
                            Debug.LogError("unmatch:" + args1Str);
                            continue;
                        }
                    }
                    if (argsCount >= 3)
                    {
                        numericFormatter = args[2].ToString();
                    }
                    if (dimensionIndex == -1)
                    {
                        dimensionIndex = 1;
                    }
                    if (numericFormatter == string.Empty)
                    {
                        numericFormatter = SerieHelper.GetNumericFormatter(serie, serie.GetSerieData(bIndex), "");
                    }
                    var value = serie.GetData(bIndex, dimensionIndex, dataZoom);
                    if (isPercent)
                    {
                        var total   = serie.GetDataTotal(dimensionIndex, serie.GetSerieData(bIndex));
                        var percent = total == 0 ? 0 : value / serie.yTotal * 100;
                        content = content.Replace(old, ChartCached.FloatToStr(percent, numericFormatter));
                    }
                    else if (isTotal)
                    {
                        var total = serie.GetDataTotal(dimensionIndex, serie.GetSerieData(bIndex));
                        content = content.Replace(old, ChartCached.FloatToStr(total, numericFormatter));
                    }
                    else
                    {
                        content = content.Replace(old, ChartCached.FloatToStr(value, numericFormatter));
                    }
                }
            }
            content = s_RegexNewLine.Replace(content, PH_NN);
            return(foundDot);
        }
        public static void ReplaceSerieLabelContent(ref string content, string numericFormatter, int dataCount, double value, double total,
                                                    string serieName, string category, string dataName, Color color, SerieData serieData)
        {
            var mc = s_RegexForSerieLabel.Matches(content);

            foreach (var m in mc)
            {
                var old       = m.ToString();
                var args      = s_RegexSubForSerieLabel.Matches(old);
                var argsCount = args.Count;
                if (argsCount <= 0)
                {
                    continue;
                }
                var pstr   = args[0].ToString();
                var p      = pstr.ElementAt(0);
                var pIndex = -1;
                if (pstr.Length > 1)
                {
                    int.TryParse(pstr.Substring(1, pstr.Length - 1), out pIndex);
                }
                if (argsCount >= 2)
                {
                    numericFormatter = args[1].ToString();
                }
                if (p == '.')
                {
                    content = content.Replace(old, ChartCached.ColorToDotStr(color));
                }
                else if (p == 'a' || p == 'A')
                {
                    content = content.Replace(old, serieName);
                }
                else if (p == 'b' || p == 'B')
                {
                    content = content.Replace(old, category);
                }
                else if (p == 'e' || p == 'E')
                {
                    content = content.Replace(old, dataName);
                }
                else if (p == 'd' || p == 'D')
                {
                    var rate = total == 0 ? 0 : value / total * 100;
                    content = content.Replace(old, ChartCached.NumberToStr(rate, numericFormatter));
                }
                else if (p == 'c' || p == 'C')
                {
                    if (pIndex >= 0 && serieData != null)
                    {
                        content = content.Replace(old, ChartCached.NumberToStr(serieData.GetData(pIndex), numericFormatter));
                    }
                    else
                    {
                        content = content.Replace(old, ChartCached.NumberToStr(value, numericFormatter));
                    }
                }
                else if (p == 'f' || p == 'f')
                {
                    content = content.Replace(old, ChartCached.NumberToStr(total, numericFormatter));
                }
                else if (p == 'g' || p == 'G')
                {
                    content = content.Replace(old, ChartCached.NumberToStr(dataCount, numericFormatter));
                }
            }
            content = TrimAndReplaceLine(content);
        }
        public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category,
                                                      string marker, string itemFormatter, string numericFormatter,
                                                      ref List <SerieParams> paramList, ref string title)
        {
            if (!serie.context.pointerEnter)
            {
                return;
            }
            dataIndex = serie.context.pointerItemDataIndex;
            if (dataIndex < 0)
            {
                return;
            }

            if (serie.radarType == RadarType.Single)
            {
                UpdateItemSerieParams(ref paramList, ref title, dataIndex, category,
                                      marker, itemFormatter, numericFormatter);
                return;
            }

            var radar = chart.GetChartComponent <RadarCoord>(serie.radarIndex);

            if (radar == null)
            {
                return;
            }

            var serieData = serie.GetSerieData(dataIndex);

            if (serieData == null)
            {
                return;
            }

            var color = SerieHelper.GetItemColor(serie, serieData, chart.theme, dataIndex, false);;

            title = serieData.name;
            for (int i = 0; i < serieData.data.Count; i++)
            {
                var indicator = radar.GetIndicator(i);
                if (indicator == null)
                {
                    continue;
                }

                var param = new SerieParams();
                param.serieName        = serie.serieName;
                param.serieIndex       = serie.index;
                param.dimension        = i;
                param.serieData        = serieData;
                param.dataCount        = serie.dataCount;
                param.value            = serieData.GetData(i);
                param.total            = indicator.max;
                param.color            = color;
                param.marker           = SerieHelper.GetItemMarker(serie, serieData, marker);
                param.itemFormatter    = SerieHelper.GetItemFormatter(serie, serieData, itemFormatter);
                param.numericFormatter = SerieHelper.GetNumericFormatter(serie, serieData, numericFormatter);
                param.columns.Clear();

                param.columns.Add(param.marker);
                param.columns.Add(indicator.name);
                param.columns.Add(ChartCached.NumberToStr(serieData.GetData(i), param.numericFormatter));

                paramList.Add(param);
            }
        }