TinyButStrong - the PHP Template Engine
Categories > OpenTBS with ODS >

Formater des nombres

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs

By: Roger
Date: 2007-02-06
Time: 10:15

Formater des nombres

J'ai un problème de formatage de nombre avec OO.

Mon script PHP produit des nombres décimaux qui sont considérés comme des textes dans OO.

Ceci que j'utilise le point ou la virgule pour le signe décimal.

Merci pour votre aide
 
Roger
By: Anonymous
Date: 2007-02-06
Time: 11:39

Re: Formater des nombres

Bonjour Roger,

C'est MALHEUREUSEMENT tout à fait normal que les nombres et les dates  sont vu par OpenOffice comme du texte.

Pourquoi ? C’est OpenOffice qui décide du type de la colonne ou de la cellule en fonction de la saisie.
Exemple : Dans une cellule on écrit le tag TBS suivant :[var.toto]
Ce dernier est interprété par OpenOffice comme du texte car cela commence par le caractère ‘[‘.

Cela empêche d’utiliser les cellules directement dans les formules de calcul du tableur, de faire des graphs à partir des données, de profiter du formatage de la colonne des dates et des nombres.

Pour formater il y a plusieurs méthodes, voir dans la doc de TBS le paramètre frm, ou par une fonction spécifique de l’utilisateur, mais les nombres ou les dates seront toujours considérés comme du texte.

Plus tard, lorsqu’il sera possible avec TBS de modifier des paramètres XML, je pourrais commencer à réfléchir sur une méthode de formatage des nombres et des dates et qu'ils soient nativement des nombres ou des dates dans OpenOffice

Olivier
By: Roger
Date: 2007-02-06
Time: 13:37

Re: Formater des nombres

Merci Olivier pour ta réponse.

C'est dommage car l'avantage de OO sur Excel avec TBS, c'est qu'il conserve les graphiques, et les macros enregistrées dans le template.
ET Je n'ai malheureusement pas encore trouvé comment transformer le texte 123.45 en un nombre 123,45 dans OO.

A+

Roger
By: loin
Date: 2007-09-25
Time: 11:06

Re: Formater des nombres

On peut contourner ceci avec une macro qui fait un rechercher/remplacer sur toutes les cellules du classeur.
Par ex:

sub OdsNbrFormatTexteEnNombre
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(17) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = true
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 1
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "^[0-9]"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = "&"
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 3

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())


end sub

Ps : en rajoutant un petit bouton qui execute la macro, ce sera tout mignon!
By: Nathan
Date: 2008-03-12
Time: 21:44

Re: Formater des nombres [formatting numbers]

Here's how I did it for a spreadsheet in an extending class:

You add the data type as a parameter to your tag, like [var.number;type=float] and it will be a floating point number.

/**
                *       An attempt to force OO.o to use the correct data types
                *      
                *       Extension of clsTinyButStrong.
                *       @author Nathan Gray
                */
                function meth_Locator_Replace(&$Txt, &$Loc, &$Value, $CheckSub) {
                        if(!$Loc->PrmLst['type']) {
                                return parent::meth_Locator_Replace($Txt, $Loc, $Value, $CheckSub);
                        }

                        // Keep these, we have to reset when we're done
                        $value_beginning =      $Loc->PosBeg;
                        $value_ending   =       $Loc->PosEnd;
                        $value_length   =       $value_ending - $value_beginning;

                        // Get container - cell only
                        tbs_Locator_EnlargeToStr($Txt,$Loc, '<table:table-cell', '>');

                        // Attributes to set
                        $cell_value = $Value;
                        foreach($Loc->SubLst as $sub) {
                                $cell_value = $cell_value[$sub];
                        }
                        $attributes = array(
                                'office:value'          =>      $cell_value,
                                'office:value-type'     =>      $Loc->PrmLst['type']
                        );

                        // Set / reset attributes
                        $hack_text = substr($Txt, $Loc->PosBeg, $value_ending - $Loc->PosBeg);
                        $hack_length = strlen($hack_text);
                        foreach($attributes as $attribute => $value) {
                                $count = 0;
                                if (preg_match("/$attribute=/", $hack_text)) {
                                        if ($addlast) {
                                                $hack_text =& preg_replace("/$attribute=\"(.*?)\"/", "$attribute=\"$value\" $lastattr=\"$lastvalue\"", $hack_text, 1, $count);
                                                unset($addlast);
                                                unset($lastattr);
                                                unset($lastvalue);
                                        } else {
                                                $hack_text =& preg_replace("/$attribute=\"(.*?)\"/", "$attribute=\"$value\"", $hack_text, 1, $count);
                                        }
                                } else {
                                        $addlast = true;
                                        $lastattr = $attribute;
                                        $lastvalue = $value;
                                }
                        }

                        // Replace the original bit with the hacked up version
                        $Txt =& substr_replace($Txt, $hack_text, $Loc->PosBeg, $value_ending - $Loc->PosBeg);

                        // Correct Loc to include changes
                        $hack_length = strlen($hack_text) - $hack_length;
                        $Loc->PosBeg = $value_beginning + $hack_length;
                        $Loc->PosEnd = $value_ending + $hack_length;

                        // Let the parent insert the value
                        $new_end= parent::meth_Locator_Replace($Txt, $Loc, $Value, $CheckSub);

                        // Reset Loc to before I messed with it so subsequent lines work
                        $Loc->PosBeg = $value_beginning;
                        $Loc->PosEnd = $value_ending;

                        return $new_end;
                }

No guarantees as to the quality or efficiency, but it does work, and allows you to generate spreadsheets with calculations.
By: Cezar
Date: 2010-10-19
Time: 11:42

Re: Formater des nombres [formatting numbers]

Nathan,

Have you got this patch upgraded to newest OpenTBS version?

cheers,

Cezar