Skip to content

Commit bc90a70

Browse files
committed
WIP: Added Fraction::reciprocal
- Added `Fraction::reciprocal` - Enabled decimal place moving of negative numbers.
1 parent ebf87f6 commit bc90a70

File tree

5 files changed

+38
-12
lines changed

5 files changed

+38
-12
lines changed

include/fraction.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ namespace steppable
224224
*/
225225
bool operator>=(const Fraction& rhs) const;
226226

227+
/**
228+
* @brief Converts a fraction to its reciprocal.
229+
* This function converts the fraction to its reciprocal.
230+
*/
231+
void reciprocal();
232+
227233
/**
228234
* @brief Simplifies a fraction.
229235
* This function simplifies the fraction by dividing the top and bottom components by their greatest common

src/fraction.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "util.hpp"
3838

3939
#include <string>
40+
#include <utility>
4041

4142
#ifdef WINDOWS
4243
#undef max
@@ -229,6 +230,12 @@ namespace steppable
229230
return compare(thisNewTop, otherNewTop, 0) != "0";
230231
}
231232

233+
void Fraction::reciprocal()
234+
{
235+
std::ranges::swap(top, bottom);
236+
simplify();
237+
}
238+
232239
void Fraction::simplify()
233240
{
234241
// Make sure the fraction does not contain decimal points.

src/rounding.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,13 @@ namespace steppable::__internals::numUtils
6464
return "0";
6565
if (number.find('.') == std::string::npos)
6666
return number;
67+
auto splitNumberResult = splitNumber(number, "0", true, true, false, false);
68+
6769
// Round off the number
68-
auto splitNumberResult = splitNumber(number, "0", true, true, false, false).splitNumberArray;
69-
auto integer = splitNumberResult[0];
70-
auto decimal = splitNumberResult[1];
70+
auto splitNumberArray = splitNumberResult.splitNumberArray;
71+
auto integer = splitNumberArray[0];
72+
auto decimal = splitNumberArray[1];
73+
bool isNegative = splitNumberResult.aIsNegative;
7174

7275
// Preserve one digit after the rounded digit
7376
decimal = decimal.substr(0, digits + 1);
@@ -102,7 +105,8 @@ namespace steppable::__internals::numUtils
102105
}
103106
std::ranges::reverse(newDecimal.begin(), newDecimal.end());
104107
decimal = newDecimal.substr(0, digits);
105-
// decimal = newDecimal;
108+
if (isNegative)
109+
integer = '-' + integer;
106110
if (decimal.empty() and digits > 0)
107111
return integer + "." + std::string(digits, '0');
108112
if (decimal.empty())
@@ -120,9 +124,11 @@ namespace steppable::__internals::numUtils
120124
// Is the number an integer?
121125
if (isInteger(number))
122126
number += ".0";
123-
auto splitNumberResult = splitNumber(number, "0", false, false, true, false).splitNumberArray;
124-
auto integer = splitNumberResult[0];
125-
auto decimal = splitNumberResult[1];
127+
auto splitNumberResult = splitNumber(number, "0", false, false, true, false);
128+
auto splitNumberArray = splitNumberResult.splitNumberArray;
129+
auto integer = splitNumberArray[0];
130+
auto decimal = splitNumberArray[1];
131+
bool isNegative = splitNumberResult.aIsNegative;
126132
auto repetitions = std::abs(places);
127133

128134
// Move decimal places to the right
@@ -151,6 +157,8 @@ namespace steppable::__internals::numUtils
151157
}
152158

153159
auto result = integer + "." + decimal;
154-
return standardizeNumber(result);
160+
if (isNegative)
161+
result = '-' + result;
162+
return standardizeNumber(removeLeadingZeros(result));
155163
}
156164
} // namespace steppable::__internals::numUtils

src/util.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,10 @@ namespace steppable::__internals::numUtils
260260
bool isPowerOfTen(const std::string& _number)
261261
{
262262
auto number = _number;
263+
if (number.front() == '-')
264+
number = number.substr(1, number.length() - 1); // Remove negative sign as it does nothing here.
263265
if (isDecimal(number))
264-
{
265-
number = number.substr(0, number.length() - 1);
266-
return not std::ranges::any_of(number, [](const auto& c) { return c != '0' and c != '.'; });
267-
}
266+
return not std::ranges::any_of(number, [](const auto& c) { return c != '0' and c != '.' and c != '1'; });
268267
if (number == "1")
269268
return true; // 1 is a power of 10.
270269
if (number.front() != '1')

tests/testFraction.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,10 @@ _.assertIsEqual(Fraction("0.5").present(), "1/2");
5959
_.assertIsEqual(Fraction(Number("0.25")).present(), "1/4");
6060
SECTION_END()
6161

62+
SECTION(Reciprocal)
63+
auto fraction = Fraction("1", "4");
64+
fraction.reciprocal();
65+
_.assertIsEqual(fraction.present(), "4/1");
66+
SECTION_END()
67+
6268
TEST_END()

0 commit comments

Comments
 (0)