ThinkGeo.com    |     Documentation    |     Premium Support

TextStyle and Format

 Hi, 


I have few questions about TextStyle. 


I display 2 informations with DefaultTextStyle "nom" and "SurfaceCarto"


So I did  : 


zleIlot.ZoomLevel15.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("[Nom]\n[SurfaceCarto] ha", "Arial", 10, DrawingFontStyles.Bold, GeoColor.SimpleColors.Black); 


And the result is in the file "TextStyle_20121213.PNG".


The problem is that the area (=surfaceCarto) has too much decimals. I would like to format this data, but I don't know how to do ... ;-(


And the last question is : 


is it possible to display "Nom" with a TextStyle as font=arial ; fontsize=8 and colorText=Black and "SurfaceCarto" with an another TextStyle as Font = arial ; ColoText=Red  ; FontSize = 6 ?


Thanks a lot for your help.


Regards.


 


Steph.


 


 



Hi Steph,  
  
 Looks like your image did not save with your post. Could you re-attach so we have a visual on the issue?

Hi Ryan,


Sorry. 



Thanks.


Regards.


Steph.


 



Hi Steph,


Here is a sample code to format,



            ShapeFileFeatureLayer layer = new ShapeFileFeatureLayer("../../sampledata/data/countries02.shp");
            layer.Open();
            TextStyle style = TextStyles.CreateSimpleTextStyle("SQKM", "Arial", 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Black);
            TextStyle style1 = TextStyles.CreateSimpleTextStyle("RECID", "Arial", 6, DrawingFontStyles.Regular, GeoColor.StandardColors.Red);
            style1.XOffsetInPixel = 30;

            GeoFont font = new GeoFont("SQKM", 8, DrawingFontStyles.Regular);
            GeoSolidBrush txtBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);

            style1.NumericFormat= "{0:f10}";
            style.NumericFormat = "{0:f2}";
            layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(style);
            layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(style1);
            layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(AreaStyles.Country1);

            layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

Regards,


Edgar


 



 Hi Edgar, 


 
Thanks.
In my case, SurfaceCarto (or SQKM) is in formatText.
And I want display the surface like the screen shot  and I don't know how to do that with TextFormat :
 
 TextStyle style1 = TextStyles.CreateSimpleTextStyle("SurfaceCarto", "Arial", 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Red,-15,-15);
 TextStyle style = TextStyles.CreateSimpleTextStyle("Nom", "Arial", 10, DrawingFontStyles.Regular, GeoColor.StandardColors.Black,0,0);
 style1.TextFormat = "???";
 AreaStyle areaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.SimpleColors.Red, 2);             
Just one more thing, the layer is a MsSql2008FeatureLayer
 
Thanks a lot.

Regards.
 
Steph.

Why is the double value storing as string format? Is it possible to change the column’s type to double of it?  
  
 Regards, 
 Edgar

Hi Edgar,  
  
 The datas come from the dictionaryValues of the MsSql2008FeatureLayer. And even if in my database (sqlserver 2008), the format of area is decimal, all the datas in the dictionaryvalues is Dictionary<string, string>. 
 That’s why the area has a string format. 
  
 Thanks  
  
 Regards. 
  
 Steph.

I see, here is how the text style works, if the "NumericFormat", "TextFormat", "DateFormat" are null, the result is just the trimmed original one, if any of the properties was set, the original text would be treat as that type, e.g. the "NumericFormat" was set, then the original text would be converted to double first, and do the formatting. Notice you can just set only one of these formats. 
  
 Regards, 
 Edgar

 Hi Edgar, 


 
Thanks.
So, in my case SurfaceCarto is a text format. But if i do  : 
 
 TextStyle style1 = TextStyles.CreateSimpleTextStyle("SurfaceCarto", "Arial", 8, DrawingFontStyles.Regular, GeoColor.StandardColors.Red,-15,-15);
                TextStyle style = TextStyles.CreateSimpleTextStyle("Nom", "Arial", 10, DrawingFontStyles.Regular, GeoColor.StandardColors.Black,0,0);
                style1.NumericFormat = "{0:F2}";
 
The value of SurfaceCarto will be converted in double. So I tested and I have this result
I tested with   style1.NumericFormat = "{0:f2}"; and I have

So the data is not converted in double format.
 
Thanks a lot for your help.
 
Regards
Stéphanie.
 

Hi Steph,


Can you try settting a 'Custom Format'?

In a Desktop Edition post listed below we encountered an issue where the 'Standard Formatting' such as {0:f2} would not work but 'Custom Formatting' did work:

countryTextStyle.NumericFormat = "000.000";


Check out this Desktop Edition link where this was discussed: gis.thinkgeo.com/Support/Dis...fault.aspx



Hi Ryan,  
  
 Thanks, with the custom Fomatting, that works. 
  
 Regards. 
  
 Steph.

Glad to hear that the custom format works in your side, but it seems that you are not using the latest code because the NumericFormat could work with the latest version, I think the bug has been fixed some months ago. 
  
 Regards, 
 Edgar

 Hi Edgar, 


I have a problem about format and textstyle when the separator of decimal is a comma (parameters of the computer)


The code is  : 



 FeatureLayerConfig ftConf = _layersMapConfig.Where(p => p.NomLayer == ConstantsMap.NOMMSSQLLAYEROCCUPSOLSQL).First() as FeatureLayerConfig;


                ValueStyle vStyleArea = new ValueStyle();


                vStyleArea.ColumnName = ftConf.FeatureIdColumn;


                TextStyle styleHaOccup = TextStyles.CreateSimpleTextStyle("SurfaceCarto", "Arial", 8, DrawingFontStyles.Bold, GeoColor.StandardColors.Black, -15, -15);


                styleHaOccup.NumericFormat = "0.00";



 


If the separator of decimal is a point (parameters of the computer), the display of the surface is correct : 



 


The dll used is Dll 6.0.0.0.


Thanks for your help.


Regards.


Steph.




Steph,


I guess this may be the culture issue, the computer's language format is different from the column value, so I think there are two options,


1, Change the "formats" in "region and language" in "control panel" to French(which decimal point is comma).


2, Change the cultureinfo in the application.



overlay.TileType=TileType.SingleTile
Thread.CurrentThread.CurrentCulture  = CultureInfo.CreateSpecificCulture("fr-FR");


Regards,


Edgar



 Hi Edgar, 


Thanks for your help.


I added in the code 


Thread.CurrentThread.CurrentCulture  = CultureInfo.CreateSpecificCulture("fr-FR");


But I had still the problem.


So I use now the event Formatting as : 



 var txtstl = TextStyles.CreateSimpleTextStyle(idLyr, "Arial", 10, DrawingFontStyles.Bold, colorTxt, 0, 0);



  txtstl.Formatting += (sender, e) =>


            {


                if (ms != null)


                {


                    if (ms.IsOpen == false) ms.Open();


                    fts = ms.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);





                    if (fts.Where(p => p.ColumnValues[idLyr] == e.Text).Any())


                    {


                        Feature ft = fts.Where(p => p.ColumnValues[idLyr] == e.Text).First() ;            


                        string s = Math.Round(double.Parse(ft.ColumnValues["SurfaceCarto"]),3).ToString();


                        e.Text = string.Format("{0}" + Environment.NewLine + "{1:0.###}", ft.ColumnValues[nmDisplay].Trim(), s + " ha");


                    }


                }


            };



and in this case, string.Format works.


I just have a last question about formatting. 


The display of the surface by using Formatting can it slow down the application compared with  ....NumericFormat = "0.00";  if there is many features in a layer ?


 


Thanks again.


Regards.


Stéphanie


 


 


 


      




Steph, 
  
 I think it will slow down the speed because of the GetAllFeatures method, you can use GetFeaturesByColumnValues instead. 
 BTW, did you aksi add the overlay.TileType=TileType.SingleTile to your code? In this type the thread culture will work. 
  
 Regards, 
 Edgar

 Hi Edgar,


Thanks for your help.


With the two lines code, this doesn't work. 


I think what raises the problem is the code styleHaOccup.NumericFormat = "0.000 ha";


Because if I don't write this in the code and the decimal separator is comma, the display is 



So the decimal comma is Ok and the value is OK too.


But I just want 3 decimals so i add styleHaOccup.NumericFormat = "0.000 ha"; and the display becomes 



Just for information, the layer is a MssqlFeatureLayer and the column "SurfaceCarto" in the database sql server 2008 is Decimal (28,10).


Thanks a lot for your help.


Regards.


Steph.


 


 



Steph,


I think you are using one textstyle to format the surface name and surface carto, right? Here is a code snippet working good with two textstyles, please have a try.



Regards,


Edgar



001_post10902.txt (1.52 KB)

BTW, the {0:f2} format is available in Development build 6.0.218.0 and later. 
  
 Regards, 
 Edgar

Hi Edgar,  
  
 Thanks for your help. 
  
 The version of dll is 6.0.0.0 for our version of production. 
 We found another solution by creating a class which inherits from Textstyle 
  
  public class LocalNumericTextStyle  : ThinkGeo.MapSuite.Core.TextStyle 
     { 
 … 
 } 
  
 We modify the method FormatCore() and we don’t have the problem anymore. 
 Thanks. 
  
 Just one question about the dll’s version of your Daily Prod builds and Daily Dev builds. 
 The Daily prod builds is more stable than your daily dev builds ?  
  
 Thus, it can be better to use the dll of the daily prod builds in our application ? 
  
 Thanks a lot for your help. 
  
 Regards. 
  
 Steph.