1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/***************************************************************************
* Copyright (C) 2003 by *
* Jason Kivlighn ([email protected]) *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#ifndef MIXEDNUMBER_H
#define MIXEDNUMBER_H
#include <tqstring.h>
/** remove any extra zeros on the end of the string and the decimal if a whole number */
TQString beautify( const TQString &num );
class TDELocale;
/** A class to hold and manipulate a mixed number.
* @author Jason Kivlighn
*/
class MixedNumber
{
public:
MixedNumber( int whole, int numerator, int denominator );
/** Create a mixed number from the given @param decimal. This uses a method that will
* approximate the actual fraction with precision equal to @param precision.
* The closer @param precision is to zero without being zero, the more precisely
* it will try to approximate the fraction.
*/
MixedNumber( double decimal, double precision = 1e-6 );
/** Creates a mixed number with an initial value of zero. */
MixedNumber();
~MixedNumber();
MixedNumber& operator+=( const MixedNumber & );
MixedNumber& operator+=( double );
bool operator!=( const MixedNumber &fraction );
bool operator>( double d )
{
return ( toDouble() > d );
}
enum Format { DecimalFormat, MixedNumberFormat };
/** The input as a decimal. */
double toDouble() const;
/** Returns the fraction as a string */
TQString toString( Format = MixedNumberFormat, bool locale_aware = true ) const;
/** The whole part of the input */
int whole() const
{
return m_whole;
}
/** The numerator of the fractional part of the input. */
int numerator() const
{
return m_numerator;
}
/** The denominator of the fractional part of the input. */
int denominator() const
{
return m_denominator;
}
void setNumerator( int n )
{
m_numerator = n;
}
void setDenominator( int d )
{
m_denominator = d;
}
/** Ensure that the fraction is simplified to its lowest terms. */
void simplify();
/** Parses the given TQString as a mixed number. The input can be
* expressed as a mixed number in the form "a b/c", or as a decimal.
*/
static MixedNumber fromString( const TQString &input, bool *ok = 0, bool locale_aware = true );
private:
static int getNumerator( const TQString &input, int space_index, int slash_index, bool *ok );
static int getDenominator( const TQString &input, int slash_index, bool *ok );
int gcd( int, int );
int m_whole;
int m_numerator;
int m_denominator;
TDELocale *locale;
};
inline const MixedNumber operator+( const MixedNumber &mn1, const MixedNumber &mn2 )
{
MixedNumber tmp = mn1;
tmp += mn2;
return tmp;
}
inline const MixedNumber operator+( double d, const MixedNumber &mn )
{
MixedNumber tmp = mn;
tmp += d;
return tmp;
}
inline const MixedNumber operator+( const MixedNumber &mn, double d )
{
return operator+(d,mn);
}
#endif //MIXEDNUMBER_H
|